Como substituir uma linha por duas linhas usando sed em csh no BSD?

0

Eu tenho um arquivo de texto muito simples aqui com o seguinte conteúdo

line1
line2
line3
line4

Eu quero modificar o conteúdo via sed (ou algum outro aplicativo) para que ele se torne

line1
line2
#this line was added by sed
line3
line4

Então, eu tentei sed -e "s/line2/line2\n#this line was added by sed/" my-text-file-here.txt , mas a saída é:

line1
line2\n#this line was added by sed
line3
line4

Alguma idéia de como fazer isso corretamente? Obrigado

    
por mrjayviper 07.09.2017 / 05:00

3 respostas

1

Isto está assumindo o csh shell:

Para simplesmente acrescentar uma linha após a outra:

% sed '/line2/a\
# new line here\
' file
line1
line2
# new line here
line3
line4

Para inserir uma linha antes da outra:

% sed '/line3/i\
# new line here\
' file
line1
line2
# new line here
line3
line4

Para substituir uma linha por duas novas linhas usando o comando s :

% sed 's/line2/&\
# new line here/' file
line1
line2
# new line here
line3
line4

Testado no OpenBSD 6.1 executando sed e csh do sistema base.

    
por 07.09.2017 / 08:34
3

Com o GNU sed, seu código funciona bem:

$ sed -e 's/line2/line2\n#this line was added by sed/' file
line1
line2
#this line was added by sed
line3
line4

Para o BSD sed, no entanto, \n não é tratado como uma nova linha no texto de substituição. Se seu shell é bash, uma boa solução é usar $'...' para inserir a nova linha:

$ sed -e $'s/line2/line2\\n#this line was added by sed/' file
line1
line2
#this line was added by sed
line3
line4

Além de bash, zsh e ksh suportam $'...' .

Outra opção é inserir uma nova linha real:

$ sed -e 's/line2/line2\
#this line was added by sed/' file
line1
line2
#this line was added by sed
line3
line4

UPDATE: no csh, esta última opção requer um \ adicional:

% sed -e 's/line2/line2\
#this line was added by sed/' file
line1
line2
#this line was added by sed
line3
line4
    
por 07.09.2017 / 05:11
2

Parece que você quer o comando a ppend, na verdade. Usando Bash ou qualquer shell que suporte $'\n' (a maioria faz):

sed $'/line2/a\\n#this line was added by sed\n' file.txt

Ou, de forma mais legível, usando um arquivo de comandos sed:

/line2/a\
#this line was added by sed

Para mostrar o método completo:

$ cat file.txt 
line1
line2
line3
line4
$ cat sedfile 
/line2/a\
#this line was added by sed
$ sed -f sedfile file.txt 
line1
line2
#this line was added by sed
line3
line4
$ 
    
por 07.09.2017 / 05:23

Tags