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

时间:2015-01-13 16:53:53

标签: regex linux shell awk sed

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

例如:

matchline_VAR
name1 xxx yyy zzz
name2 aaa bbb ccc
matchline_VAR

需要成为(如果不是我可以进行后期处理以删除匹配线):

VAR_name1 xxx yyy zzz
VAR_name2 aaa bbb ccc

现在我正在尝试像这样:

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

而只是在线前打印1。

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

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的开头附加名称。

感谢任何帮助,

约翰

2 个答案:

答案 0 :(得分:1)

您可以使用此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$2之间切换""
  • p{$0 = p FS $0} - 如果设置了p,则在整行中附加p
  • 1 - 打印每行的默认操作

答案 1 :(得分:1)

$ awk 'sub(/matchline_/,""){pfx=$0;next} {print pfx"_"$0}' file
VAR_name1 xxx yyy zzz
VAR_name2 aaa bbb ccc