sed, acrescenta linha na correspondência somente se ela ainda não existir

sed, acrescenta linha na correspondência somente se ela ainda não existir

Usando sed (GNU sed) 4.2.2, quero:

  1. CorresponderLine1
  2. Verifique Line2, logo abaixo Line1, se é igualString
  3. Caso contrário, anexe Stringdepois Line1(ou insira antes Line2)

O que eu tentei:

echo -e "Line1\nLine2\nLine3" | sed '/Line1/n;/^String$/!iString'

mas retorna:

Linha1
Sequência
Linha2
Sequência
Linha3

Eu também tentei:

echo -e "Line1\nLine2\nLine3" | sed '/Line1/{n;/^String$/!iString}'

mas ele retorna

sed: -e expressão #1, caractere 0: `{' incomparável

Sei fazer de outra forma, também usando sed, mas procuro entender como fazer exatamente da maneira que descrevi acima. Além disso, diga-me o que há de errado com meu código.

Responder1

Tentar:

sed '/Line1/{N; /\nString$/b; s/\n/\nString\n/}' file

Limitação: Se duas linhas Line1aparecerem seguidas, isso pode ou não fazer o que você deseja.

Exemplo

Vamos considerar este arquivo de teste:

$ cat file
Line1
String
Line2
String
Line3
Line1
Line2

E vamos aplicar nosso comando:

$ sed '/Line1/{N; /\nString$/b; s/\n/\nString\n/}' file
Line1
String
Line2
String
Line3
Line1
String
Line2

Como funciona

  • Line1/{...}

    Isso executa os comandos entre chaves somente se a linha atual corresponder ao regex Line1.

  • N

    Isso lê a próxima linha e a anexa à linha atual com as duas linhas separadas por uma nova linha.

  • /\nString$/b

    Se a segunda linha corresponder ao regex \nString$, pule o restante dos comandos ("branch", b).

  • s/\n/\nString\n/

    Isso substitui a nova linha que separa a primeira e a segunda linhas por uma nova linha seguida Stringpor outra nova linha.

informação relacionada