Comportamento estranho da utilidade 'sed'

1

Estou usando o sed no Windows pela porta do GnuWin32. Eu tenho um arquivo de texto input.txt com este conteúdo

ab

Eu tentei esses comandos combinados para separar o caractere a em uma nova linha e, em seguida, excluir a linha contendo esse caractere a , pois achei que os comandos foram executados um após o outro

sed "s/a/\na\n/ ; /a/d" "input.txt" > "output.txt"

No entanto, acabei de obter um arquivo output.txt em branco. Se eu dividir isso em dois comandos diferentes

sed "s/a/\na\n/" "input.txt" > "output1.txt"
sed "/a/d" "output1.txt" > "output2.txt"

Em seguida, tudo funciona bem, o arquivo output2.txt tem apenas uma linha com o caractere b . Então, o que eu fiz de errado?

    
por Teiv 26.10.2015 / 04:25

1 resposta

3

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.

    
por 26.10.2015 / 04:51