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

0

Usando o sed (GNU sed) 4.2.2, eu quero:

  1. Corresponder Line1
  2. Verifique Line2 , logo abaixo de Line1 , se for igual a String
  3. Se isso não acontecer - anexe String após Line1 (ou insira antes Line2 )

O que eu tentei:

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

mas retorna:

Line1
String
Line2
String
Line3

Eu também tentei:

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

mas retorna

sed: -e expression #1, char 0: unmatched '{'

Eu sei como fazer isso de outra maneira, também usando sed, mas eu tento entender como alcançá-lo da maneira exata que descrevi acima. Além disso, por favor me diga o que há de errado com o meu código.

    
por Kacper Witek 28.02.2018 / 00:46

1 resposta

0

Tente:

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

Limitação: Se duas linhas com Line1 aparecerem em uma linha, 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 só executa os comandos em chaves se a linha atual corresponder à 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 à 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 nova linha, seguidas por String seguido por outra nova linha.

por 28.02.2018 / 00:54

Tags