使用反向引用在两个模式之间添加所有行
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
我正在编写一个简单的脚本,为匹配之间的所有行添加部分模式匹配。
例如:
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