multiline sed substitution sobrescreve a saída anterior

1

Estou tentando fazer uma substituição de sed em duas linhas como esta:

sed -r '/user-type/{N;s/user-type: (.*)\n.*gth: .*([0-9]+).*$/ /}'

Eu obtive esta sintaxe de uma resposta aqui , o que explica que eu primeiro coincidir com a primeira linha do padrão e, em seguida, adicionar a próxima linha ao espaço de padrão com N para fazer a substituição. Isso funcionou para mim em ocasiões anteriores, mas desta vez a coisa mais estranha acontece.

Para entrada:

user-type: admin
password minumim length: 8
user-type: auth
password minumim length: 8

Eu recebo:

 8min
 8th

Quando eu esperava:

admin 8
auth 8

Parece que a segunda correspondência salva é impressa a partir do início da linha e substitui o que foi impresso anteriormente.

Alguma ideia?

    
por Luis E 23.08.2016 / 23:27

1 resposta

1

Seu comando funciona para mim:

$ sed -r '/user-type/{N;s/user-type: (.*)\n.*gth: .*([0-9]+).*$/ /}' file.txt
admin 8
auth 8

Se, no entanto, se converter a entrada para o formato DOS, recebo a saída que você vê:

$ sed -r '/user-type/{N;s/user-type: (.*)\n.*gth: .*([0-9]+).*$/ /}' <(sed 's/$/\r/' <file.txt)
 8min
 8th

Uma solução é converter seu arquivo de entrada em terminações de linha no estilo unix.

Outra solução é ajustar o comando sed para ser tolerante a \r caracteres:

$ sed -r '/user-type/{N;s/user-type: (.*)\n.*gth: .*([0-9]+).*$/ /; s/\r//}' <(sed 's/$/\r/' <file.txt)
admin 8
auth 8

Ou:

$ sed -r '/user-type/{N;s/user-type: ([^\r]*).?\n.*gth: .*([0-9]+).*$/ /}' <(sed 's/$/\r/' <file.txt)
admin 8
auth 8
    
por 23.08.2016 / 23:38