awk 和 grep 使用相同的模式,但需要对转义序列进行不同的处理

gawk and grep using same pattern but need different treatement for escape sequence

我有一个 bash shell 脚本(名为 testawk 以用一行或多行(第二个参数)替换包含模式(第一个参数)的行并运行在第 3 个参数中给出的文件名上。shell 脚本如下:

#!/bin/bash
if  grep -s "" ""  > /dev/null; then
  gawk -v nm2="" -v nm1="" '{ if ([=10=] ~ nm1) print nm2;else print [=10=]}' "" > "".bak
  mv "".bak ""
fi

如果我有一个名为 "aa" 的文件,其中包含以下内容:

a;
b<*c;

而且,如果我 运行 testawk 作为:

./testawk "a;" "x<*y;" "aa"

aa 包含:

x<*y;
b<*c;

但是,如果我 运行 testawk 在原始 aa 文件上再次显示为:

./testawk "b<*c;" "x<*y;" "aa"

aa 现在包含为(未更改的内容):

a;
b<*c;

因为grep "b<*c;" "aa"找不到模式。 为了让 grep 开心,如果我使用转义序列:

grep "b<\*c;" "aa"

可以匹配显示:

b<*c;

如果我使用 testawk 使用转义序列如下:

./testawk "b<\*c;" "x<*y;" "aa"

gawk 不喜欢这样并抱怨:

gawk: warning: escape sequence `\*' treated as plain `*'

并且 aa 没有更改内容,因为:

a;
b<*c;

grepgawk 都乐于找到并替换 b<*c; 的任何补救措施 请建议如何替换 b<*c;.

这应该可以满足您的要求:

if awk -v nm2="" -v nm1="" 'index([=10=],nm1){f=1; [=10=]=nm2} 1; END{exit !f}' "" > ".bak"
then
    mv ".bak" ""
    # do stuff with modified file ""
else
    rm -f ".bak"
    # do stuff with unmodified file ""
fi

除反斜杠外,无需转义任何内容,如果您有反斜杠,我们可以采用不同的方式处理。