shell 如何在bash中将带引号的字符串赋给变量,并在awk中将其用作模式?

eoigrqb6  于 2022-12-30  发布在  Shell
关注(0)|答案(2)|浏览(150)

我使用的命令是:

objects=shubham
awk -v myvar="$objects" '($0~myvar),/REPLACE/' a.txt

这a.txt文件包含

other-unwanted-content-here
target(shubham)
hello('shubham')
abc
bcd
REPLACE
other-unwanted-content-here

我想要的输出是:

hello('shubham')
abc
bcd
REPLACE

......但是我也得到了target(shubham)。我怎样才能使带引号的hello('shubham') * 成为awk开始匹配的地方呢?

bjp0bcyl

bjp0bcyl1#

两种方法,取决于你想要什么。

  • 保持objects的定义不变,修改awk变量的赋值
objects=shubham
awk -v myvar="^hello[(]'$objects'[)]\$" '($0~myvar),/REPLACE/' <<'EOF'

看到它在https://ideone.com/Bto1hB上运行

  • 更改objects以仅匹配目标行
objects="^hello[(]'shubham'[)]\$"
awk -v myvar="$objects" '($0~myvar),/REPLACE/' a.txt

看到它在https://ideone.com/nF8MUl上运行
注意,在任何一种情况下,awk中的~都是正则表达式操作符;因为在大多数正则表达式形式(包括POSIX ERE)中,()是语法,所以我们必须将字符串更改为与所需行匹配的正则表达式,而不是恰好包含该行本身。(注意,在这两种情况下,正则表达式中$前面的反斜杠是shell语法,而不是正则表达式语法本身,之所以需要,只是因为我们使用了双引号;在单引号中,那些反斜杠需要被省略)。

ou6hu8tu

ou6hu8tu2#

如果pattern对于相关行是唯一的,那么将起始行模式中的变量(使用&&)与/hello/组合应该可以解决额外行的问题:

awk -v myvar="$objects" '($0~myvar && /hello/),/REPLACE/' a.txt

输出:

hello('shubham')
abc
bcd
REPLACE

使用mawk 1.3.4在树莓派400上进行测试

相关问题