次の入力があります。
*123456789
This is a <secret>
Other stuff here.
*987654321
This is a <secret>
Other stuff here.
その中には「ここには別のものがあります」があります。 1行以上があるかもしれませんが、*プレフィックスの付いた数字は可変ですが、常に行全体を占有し、常に一致する固定テキスト文字列「<secret>」の前の行に表示されます。に。
私はこれをシェルスクリプトの1行コマンドにパイプして、"* 123456789"文字列が次の行の<secret>エントリを置き換えて、出力が次のようになるようにしたいと思います。
This is a *123456789
Other stuff here.
This is a *987654321
Other stuff here.
私はsedの複数行の処理を理解するのに苦労しており、他のきちんとしたツールを使用するために開いています。
答え1
sed を使用すると、 を使用して次の行を取得し、 を使用してN
セクションを並べ替えることができますs
。たとえば、
$ sed -E '/^\*[0-9]{1,}$/{N;s/(.*)\n(.*)<secret>/\2\1/}' file
This is a *123456789
Other stuff here.
This is a *987654321
Other stuff here.
答え2
$ awk '/^\*/ {secret=$0;next}; {gsub(/<secret>/,secret,$0); print}' input.txt
This is a *123456789
Other stuff here.
This is a *987654321
Other stuff here.
*
「シークレット」から先行部分を削除するには、awkのsubstr()
機能を使用できます。
$ awk '/^\*/ {secret=substr($0,2);next}; {gsub(/<secret>/,secret,$0); print}' input.txt
This is a 123456789
Other stuff here.
This is a 987654321
Other stuff here.