複数行のsed置換が前の出力を上書きします

複数行のsed置換が前の出力を上書きします

次の2行をsedに置き換えようとしています。

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

答えからこの構文を得ました。ここ、パターンの最初の行を最初に一致させ、次に置換のためにパターンNスペースに次の行を追加すると説明します。以前はこれが私にとって効果的でしたが、今回は最も奇妙なことが起こりました。

入力の場合:

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

私は得る:

 8min
 8th

私が期待したとき:

admin 8
auth 8

2番目に保存された一致は行の先頭から印刷され、以前に印刷された内容を置き換えるように見えます。

どんなアイデアがありますか?

答え1

あなたの命令は私にとって効果的です。

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

ただし、入力をDOS形式に変換すると、次のような出力が表示されます。

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

1つの解決策は、入力ファイルをUNIXスタイルの行末に変換することです。

別の解決策は、文字を受け入れるようにsedコマンドを調整することです\r

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

または:

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

関連情報