
Usando sed (GNU sed) 4.2.2, quero:
- Corresponder
Line1
- Verifique
Line2
, logo abaixoLine1
, se é igualString
- Caso contrário, anexe
String
depoisLine1
(ou insira antesLine2
)
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 Line1
aparecerem 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
String
por outra nova linha.