如何避免 awk 中的倾斜牙签综合症?

如何避免 awk 中的倾斜牙签综合症?

当将模式与/其中匹配时,必须/快速逃脱变得笨拙、丑陋:

/\/usr\/share\/man\//

对于 sed、perl 或 Vim,我会为正则表达式使用不同的分隔符,例如:

sed '\:/usr/share/man/: do something'
perl -ne 'print if m:/usr/share/man/:'
:g:/usr/share/man/: do something " Vim

我怎样才能避免这个awk?就像是:

awk ':/usr/share/man/: {do something}'

我能想到的最好的方法是使用变量:

awk -v pat='/usr/share/man/' '$0 ~ pat {do something}'

但与 sed/perl/vim 方法相比,这非常冗长。


当然,可能还有其他方法来匹配路径,例如/usr/share/man/,但这并不是唯一/可能出现在模式中的地方。

答案1

只需更改/testregexp/$0 ~ "testregexp"

简单的例子:

$ echo "a/b/c" | awk ' ( $0 ~ "a/b/c" ) { print "we have a winner" ; }'
we have a winner

另一个例子

regexp='some regexp "with /lots/ of double quotes" "everywhere"'
awk -v reg="${regexp}" ' ( $0 ~ reg ) { action here... }'

答案2

awk 本身没有任何简单、直接的解决方法。在一般情况下,切换到 Perl(或sed针对简单任务切换到 Perl)是常见的解决方法。

相关内容