如何转义在包含 awk 命令的函数中输入的特殊字符?

问题描述 投票:0回答:1

为了让这个问题简单地演示,我制作了一个像这样的假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 `<'

所以我尝试在

,/ 之前添加一些转义字符 (
\<,>),但它不起作用。我该怎么办?

bash awk
1个回答
0
投票

使用真正的 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
© www.soinside.com 2019 - 2024. All rights reserved.