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;
让 grep
和 gawk
都乐于找到并替换 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
除反斜杠外,无需转义任何内容,如果您有反斜杠,我们可以采用不同的方式处理。
我有一个 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;
让 grep
和 gawk
都乐于找到并替换 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
除反斜杠外,无需转义任何内容,如果您有反斜杠,我们可以采用不同的方式处理。