shell 如何使用正则表达式在if语句中匹配awk中的“^”符号?

8ehkhllq  于 2023-03-30  发布在  Shell
关注(0)|答案(4)|浏览(103)

我想在awk脚本中使用正则表达式来匹配像^这样的符号,并在它们在if语句中匹配时执行某些操作。
然而,我已经尝试在MARK="^”或使用MARK="^"中增加反斜杠的数量,但我仍然无法获得匹配。
还有其他可能的原因需要考虑吗?

MARK="^"

awk ~~~
if (mark ~ "['$MARK}']+") {
            print $1;
}

我试图用反斜杠转义它,并希望它匹配。

0ve6wy6x

0ve6wy6x1#

你试过用它的ASCII码来匹配吗?
\x5E

svgewumm

svgewumm2#

这里不需要“if”,一个模式就足够了。另外,[^]可能不起作用(它在gawk中不起作用),你需要转义插入符号:

mark=^
echo $'a\nb\nq^x\nd' | awk '(/\'"$mark"'/){print}'
3vpjnl9f

3vpjnl9f3#

给定:

cat file
Line 1
Line^2
Line 3

你可以使用^转义的模式如下:

awk '/\^/' file 
Line^2

要使用带有特定 meta字符^dynamic 正则表达式,您需要做一些转义技巧。
这是可行的:

mark='\\^'
awk -v m="$mark" '$0~m' file
# Line^2

或者这个:

mark='^'
awk -v m="$mark" 'BEGIN{pat="\\" m}
$0~pat' file
# same

这在GNU awk手册的HERE中有介绍。
更简单的方法是使用index

mark='^'
awk -v m="$mark" 'index($0,m)' file

它将查找文字^而不进行任何转义。

5lwkijsr

5lwkijsr4#

如果没有更多关于你正在尝试做什么的信息,你不应该转义元字符来使一个regexp元字符在regexp比较中表现得像一个文字字符,即增强这个:

if (mark ~ "['$MARK}']+") {
            print $1;
}

你应该只做一个字面字符串比较:

if ( index(mark,"'"$MARK"'") ) {
            print $1;
}

但是你也不应该让shell变量扩展成为awk脚本的一部分,参见How do I use shell variables in an awk script?,所以你应该这样做或类似的:

awk -v m="$MARK" '{
    .... whatever populates "mark" ....
    if ( index(mark,m) ) {
                print $1;
    }
}'

相关问题