我有这样的输入:
*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.