sed 将一行替换为下一行的一部分

sed 将一行替换为下一行的一部分

我有这样的输入:

*123456789
This is a <secret>
Other stuff here.
*987654321
This is a <secret>
Other stuff here.

其中“这里有其他东西”。可以多一行,但以 * 为前缀的数字是可变的,但始终会占据整行,并且始终出现在“<secret>”之前的行上,“<secret>”是可匹配的文字固定字符串反对。

我希望能够将其通过管道传输到 shell 脚本中的单行命令中,以便“*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.

相关内容