awk。正则表达式之前的“@”符号是什么意思

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

它取自“awk-exercises”。

对于输入文件patterns.txt,过滤包含三个或更多的行 出现“ar”并将最后一个但第二个“ar”替换为“X”

标准车焦油远车

零件车市场

预期产量

标准车 tX 远车

pXt 购物车市场

awk 'BEGIN{r = @/(.*)ar((.*ar){2})/} $0~r{print gensub(r, "\\1X\\2", 1)}' patterns.txt

有人认为我无法理解。 BEGIN 块中的“@”是什么意思?

regex linux awk
1个回答
1
投票

awk
gensub()
函数中的“@”符号充当正则表达式的文字字符串指示符。它告诉
gensub()
将以下模式解释为文字字符串,而不是正则表达式。当您想在正则表达式中使用在
awk
上下文中具有不同含义的特殊字符时,这一点很重要。

为什么在这种情况下需要它?

在您提供的示例中:

BEGIN{r = @/(.*)ar((.*ar){2})/} $0~r{print gensub(r, "\\1X\\2", 1)}

正则表达式

/(.*)ar((.*ar){2})/
包含括号,括号在正则表达式中具有特殊含义。通过在正则表达式之前使用“@”,您可以确保
gensub()
将其视为文字字符串,保留括号原样,而不是将它们解释为捕获组。

带有和不带有“@”的示例

假设您有一个名为

data.txt
的文件,其中包含以下内容:

这是一行带有一些文本的行。 另一行有更多文字。

不带“@”的代码

BEGIN{r = /(.*)text/} {print gensub(r, "\\1replaced", 1)}' data.txt

此代码将尝试捕获“文本”之前的所有内容,但可能会导致错误,因为括号被解释为捕获组,并且

gensub()
函数可能无法按预期运行。

带有“@”的代码

BEGIN{r = @/(.*)text/} {print gensub(r, "\\1replaced", 1)}' data.txt

此代码将成功地将“text”的第一个实例替换为“replaced”,因为正则表达式被视为文字字符串。

© www.soinside.com 2019 - 2024. All rights reserved.