Adicionando 2 linhas na sub-rotina do arquivo de texto

2

Eu tenho um arquivo de texto dividido em sub-rotinas. Cada estrofe começa com uma [palavra-chave] e termina com uma linha em branco. Algo parecido com isto:

[keyword1]
param1 = value1
param2 = value2
param3 = value3

[keyword2]
param4 = value4
param5 = value5
...

Eu preciso de um script (provavelmente um comando de uma linha funcionará) para inserir 2 linhas imediatamente após um dado [keyword] . Linhas a serem inseridas são como os casais acima:

param = value

Eu estava pensando em usar o sed com a edição em vigor, além de um arquivo de cópia de segurança apenas por precaução.

    
por ztank1013 09.11.2011 / 12:39

2 respostas

7

Sim, sed parece a escolha certa:

sed -i.bak '/^\[keyword1\]/aparam = value\nparam = other' your.file

awk pode fazer isso, exceto a parte de edição no local:

awk '1;/^\[keyword1\]/{print"param = value";print"param = other"}' your.file > new.file

Se você não se importa em usar uma arma grande como perl para uma tarefa tão pequena:

perl -i.bak -pe '$_.="param = value\nparam = other\n"if/^\[keyword1\]/' your.file

O mais recente funcionará em ruby com 1 modificação de caractere:

ruby -i.bak -pe '$_+="param = value\nparam = other\n"if/^\[keyword1\]/' your.file
A solução

python é um pouco demorada (provavelmente piorada pela fraqueza do meu conhecimento):

python -c 'import sys,fileinput;[sys.stdout.write(line+("param = value\nparam = other\n" if line=="[keyword1]\n" else "")) for line in fileinput.input(inplace=1,backup=".bak")]' your.file

Novamente sem a edição no local, mas bash e ksh também podem fazer isso:

while IFS='' read -r line; do
  echo "$line"
  [[ "$line" == '[keyword1]' ]] && {
    echo "param = value"
    echo "param = other"
  }
done < your.file > new.file

Com ed é simples de editar no local, mas não sei como criar backup:

ed -s your.file <<< $'/^\[keyword1\]/a\nparam = value\nparam = other\n.\nwq'
    
por 09.11.2011 / 13:28
0

Se você usa vim como seu editor, pode configurar abreviações em .vimrc da seguinte forma:

:abbr key1 [keyword1]^M^Iparam1 = value1^M^Iparam2 = value2^M^Iparam3 = value3^M
:abbr key2 [keyword2]^M^Iparam4 = value4^M^Iparam5 = value5^M

Agora, em qualquer arquivo, no modo de inserção, se você digitar key1 e pressionar enter , verá:

[keyword1]
       param1 = value1
       param2 = value2
       param3 = value3

Se é o tipo de coisa que você faz com frequência e repetidamente, vim abreviações podem aliviar a dor.

    
por 09.11.2011 / 17:46