我正在开发一个简单的脚本,为匹配之间的所有行添加部分模式匹配。
例如:
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的开头附加名称。
感谢任何帮助,
约翰
答案 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