使用反向引用在两个模式之间添加所有行

Prepend all lines between two patterns with back-reference

我正在编写一个简单的脚本,为匹配之间的所有行添加部分模式匹配。

例如:

matchline_VAR
name1 xxx yyy zzz
name2 aaa bbb ccc
matchline_VAR

需要变成(如果不是简单删除匹配线,我可以post-处理删除它们):

VAR_name1 xxx yyy zzz
VAR_name2 aaa bbb ccc

现在我正在 sed 中尝试这样:

sed '/matchline_\(.*$\)/,/matchline_/ {s/^/_/g}'

它只是在行的前面打印一个 1。

也许我还应该提到,这是一个更大的脚本的一部分,用于搜索文本文件并将 shell 变量 $find(一行)的每个实例替换为另一个 shell 变量$replace(多行)。目前的解决方案是:

awk -v find="$find" -v replace="$replace" '[=13=]==find{[=13=]=replace}1' file

问题是我需要将 $find 中的第一个字段附加到 $replace 的每一行 我试过了:

awk -v find="$find" -v replace="$replace" '[=14=]==find{[=14=]="matchline_"  "_" replace}1'

但它只在多行 $replace 的开头附加名称。

感谢任何帮助,

约翰

您可以使用这个 awk 命令:

awk -F_ '=="matchline"{p = (!p)?  : ""; next} p{[=10=] = p FS [=10=]} 1'
VAR_name1 xxx yyy zzz
VAR_name2 aaa bbb ccc

解释:

  • -F_ - 使用字段分隔符作为下划线
  • =="matchline" - 当 field1 == "matchline"
  • 时执行下一个块
  • p = (!p)? : "" - 在 </code> 和 <code>"" 之间切换 p 以上条件
  • p{[=17=] = p FS [=17=]} - 如果设置了 p 则在整行中追加 p
  • 1 - 打印每行的默认操作
$ awk 'sub(/matchline_/,""){pfx=[=10=];next} {print pfx"_"[=10=]}' file
VAR_name1 xxx yyy zzz
VAR_name2 aaa bbb ccc