为了让这个问题简单地演示,我制作了一个像这样的假xml文件。
<abc>
<spirit:addressBlock>
<spirit:name>cmn700_registers</spirit:name>
<def>
</def>
</spirit:addressBlock>
</abc>
我想在一个行块内打印包含模式
<spirit:name>
的行,该行以模式<spirit:addressBlock>
开始并以</spirit:addressBlock>
结束。我在 .bash_aliase 中定义了一个函数,如下所示。
function SearchPatInBlk {
awk "/$1/{inblk=1} inblk==1&&/$2/{inblk=0} inblk==1&&/$3/{print \$0}" $4
}
所以第一个参数和第二个参数是块开始和结束模式,第三个参数是我想要打印行的模式,第四个参数是 xml 文件名。然后我在 bash shell 中发出了这个命令。
SearchPatInBlk <spirit:addressBlock> </spirit:addressBlock> <spirit:name> ../../ab21/ab21_cmn700_new10_clst/build/ab21_cmn700/logical/cmn700/ipxact/cmn700_ab21.xml
当然这给了我一个错误。
bash: syntax error near unexpected token `<'
所以我尝试在
,/ 之前添加一些转义字符 (
\
<,>),但它不起作用。我该怎么办?
使用真正的 XML 解析器会比像
awk
这样的通用文本处理器更好。但如果你绝对需要awk
,有几件事需要解决:
awk
变量传递给 awk
,而不是作为 awk
脚本的一部分。regex,regex
awk
范围模式。您也可以使用更准确的正则表达式。示例:
function SearchPatInBlk {
awk -v v1="$1" -v v2="$2" -v v3="$3" 'v1,v3 {if($0 ~ v3) print}' "$4"
}
SearchPatInBlk '@/^[[:space:]]*[<]spirit:addressBlock[>][[:space:]]*$/' \
'@/^[[:space:]]*[<][/]spirit:addressBlock[>][[:space:]]*$/' \
'@/[<]spirit:name[>]' file