我想在awk脚本中使用正则表达式来匹配像^这样的符号,并在它们在if语句中匹配时执行某些操作。然而,我已经尝试在MARK="^”或使用MARK="^"中增加反斜杠的数量,但我仍然无法获得匹配。还有其他可能的原因需要考虑吗?
MARK="^" awk ~~~ if (mark ~ "['$MARK}']+") { print $1; }
我试图用反斜杠转义它,并希望它匹配。
0ve6wy6x1#
你试过用它的ASCII码来匹配吗?\x5E
\x5E
svgewumm2#
这里不需要“if”,一个模式就足够了。另外,[^]可能不起作用(它在gawk中不起作用),你需要转义插入符号:
[^]
mark=^ echo $'a\nb\nq^x\nd' | awk '(/\'"$mark"'/){print}'
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:
index
mark='^' awk -v m="$mark" 'index($0,m)' file
它将查找文字^而不进行任何转义。
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; } }'
4条答案
按热度按时间0ve6wy6x1#
你试过用它的ASCII码来匹配吗?
\x5E
svgewumm2#
这里不需要“if”,一个模式就足够了。另外,
[^]
可能不起作用(它在gawk中不起作用),你需要转义插入符号:3vpjnl9f3#
给定:
你可以使用
^
转义的模式如下:要使用带有特定 meta字符
^
的 dynamic 正则表达式,您需要做一些转义技巧。这是可行的:
或者这个:
这在GNU awk手册的HERE中有介绍。
更简单的方法是使用
index
:它将查找文字
^
而不进行任何转义。5lwkijsr4#
如果没有更多关于你正在尝试做什么的信息,你不应该转义元字符来使一个regexp元字符在regexp比较中表现得像一个文字字符,即增强这个:
你应该只做一个字面字符串比较:
但是你也不应该让shell变量扩展成为awk脚本的一部分,参见How do I use shell variables in an awk script?,所以你应该这样做或类似的: