Awk gensub()与正则表达式不匹配

时间:2019-02-18 14:05:18

标签: regex linux unix awk

我需要修改一些文件以替换其中的一部分。文件内容的示例如下所示。

    <title>block-quote-line</title>
    <path d="M11.86,16.55a4.31,4.31,0,0,0-2.11.56,14.44,14.44,0,0,1,4.36-6,1.1,1.1,0,0,0-1.4-1.7c-4,3.25-5.78,7.75-5.78,10.54A5.08,5.08,0,0,0,10,24.58a4.4,4.4,0,0,0,1.88.44,4.24,4.24,0,1,0,0-8.47Z" class="clr-i-outline clr-i-outline-path-1"></path><path d="M23,16.55a4.29,4.29,0,0,0-2.11.56,14.5,14.5,0,0,1,4.35-6,1.1,1.1,0,1,0-1.39-1.7c-4,3.25-5.78,7.75-5.78,10.54a5.08,5.08,0,0,0,3,4.61A4.37,4.37,0,0,0,23,25a4.24,4.24,0,1,0,0-8.47Z" class="clr-i-outline clr-i-outline-path-2"></path>
    <rect x="0" y="0" width="36" height="36" fill-opacity="0"/>
</svg>

文件的class="clr-i-outline clr-i-outline-path-[]"部分需要修改为fill = "#000000".

与字符串匹配的正则表达式如下

(class=clr-i-outline clr-i-outline-path-[1-9])

现在,我需要将此正则表达式集成到命令中,但是该命令不起作用。

awk -v regex="(class=\"clr-i-outline clr-i-outline-path-\[1-9\]\")" -v trgt="fill = \"#AB7C94\"" '{ gensub (/regex/, trgt, "g" ) ./test.svg}'

我在做什么错了?

1 个答案:

答案 0 :(得分:2)

如果test.svg是您要替换的文件:

awk -v regex='class="clr-i-outline clr-i-outline-path-[1-9]"' -v trgt='fill = "#AB7C94"' '{ print gensub(regex, trgt, "g" )}' test.svg

或者:

awk -v regex='class="clr-i-outline clr-i-outline-path-[1-9]"' -v trgt='fill = "#AB7C94"' '{ gsub(regex, trgt)}1' test.svg

两者都可以在GNU awk上使用。

您可以使用符号引号'将内部带有双引号的字符串括起来,而不必在单引号内转义"[]
同样,在将变量称为正则表达式时,只需使用变量名,而不要使用/variable/

您并没有打印输出,gensub不会更改它替换的内容,但是会返回它,因此您只需打印它即可。
另一方面,gsub会更改,但不会返回更改后的内容,您可以随后打印。

相关问题