在我的 shell 函数之一中具有以下内容:
function _process () {
awk -v l="$line" '
BEGIN {p=0}
/'"$1"'/ {p=1}
END{ if(p) print l >> "outfile.txt" }
'
}
Run Code Online (Sandbox Code Playgroud)
,所以当被称为 as 时_process $arg,$arg会被传递为$1,并用作搜索模式。它是这样工作的,因为 shell 扩展$1代替了 awk 模式!也l可以在 awk 程序中使用,用-v l="$line". 一切都很好。
是否可以以相同的方式将模式作为变量进行搜索?
以下将不起作用,
awk -v l="$line" -v search="$pattern" '
BEGIN {p=0}
/search/ {p=1}
END{ if(p) print l >> "outfile.txt" }
'
Run Code Online (Sandbox Code Playgroud)
, 因为 awk 不会解释/search/为变量,而是按字面意思解释。
我正在尝试sed从长文件(Junos 配置)中提取像这样的大括号分隔的配置块:
group foo {
command;
setting {
value;
}
command;
}
Run Code Online (Sandbox Code Playgroud)
诀窍是停在}与第一行缩进相同的地方。
我学习了如何使用sed从一种模式匹配到另一种模式,并尝试了以下操作:
$ sed -rn '/^( *)group foo/,/^\1\}/p' config.txt
sed: -e expression #1, char 41: Invalid back reference
Run Code Online (Sandbox Code Playgroud)
问题是/^( *)group foo/和/^\1\}/是两个独立的模式,并且反向引用在它们之间不起作用吗?如果是这样,我怎样才能做到这一点?