O comando /a/d
não exclui uma linha; Exclui o espaço do padrão. Enquanto um espaço de padrão contém inicialmente apenas uma linha, seu primeiro comando substituto torna o espaço de padrão em duas linhas. Para remover apenas a linha que termina com a
, tente:
$ sed "s/a/a\n/ ; s/[^\n]*a\n//" "input.txt"
b
A regex [^\n]*a\n
corresponde a tudo na linha que termina com a
. É substituído por nada.
Como alternativa, se você quiser excluir do espaço de padrão, uma linha que consiste inteiramente em a
:
$ sed "s/a/\na\n/ ; s/\na\n//" "input.txt"
b
Documentação
A documentação do sed é clara: o comando d
exclui o espaço do padrão.
Do manual do GNU sed :
d
Delete the pattern space; immediately start next cycle.
A partir da especificação de POSIX awk :
[2addr]d
Delete the pattern space and start the next cycle.
Normalmente, um espaço de padrão sed consiste em uma única linha, caso em que a distinção entre espaço de linha e padrão não é importante. Mas há muitas maneiras, como s/a/a\n/
, de colocar várias linhas em um espaço de padrão. Nesse caso, a diferença é importante.