次の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