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

我正在做一个简单的脚本,以预先匹配匹配之间所有行的模式匹配的一部分。

例如:

matchline_VAR name1 xxx yyy zzz name2 aaa bbb ccc matchline_VAR 

需要成为(如果简单删除matchlines,如果不是我可以后处理删除它们):

 VAR_name1 xxx yyy zzz VAR_name2 aaa bbb ccc 

现在我正在尝试像这样:

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

而是在行前打印1。

也许我还应该提到,这是一个更大脚本的一部分,用于search文本文件,并用另一个shellvariables$ replace(多行)replaceshellvariables$ find(一行)的每个实例。 目前的解决scheme是:

 awk -v find="$find" -v replace="$replace" '$0==find{$0=replace}1' file 

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

 awk -v find="$find" -v replace="$replace" '$0==find{$0="matchline_" $1 "_" replace}1' 

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

任何帮助表示赞赏,

约翰

Solutions Collecting From Web of "用反向引用在两个模式之间加上所有行"

你可以使用这个awk命令:

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

说明:

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