Regex 如何在不使用match()函数的情况下在awk中使用单词边界?

Regex 如何在不使用match()函数的情况下在awk中使用单词边界?,regex,awk,word-boundary,Regex,Awk,Word Boundary,我想将单词边界添加到此awk命令: awk '{$0=tolower($0)};/wordA/&&/wordB/ { print FILENAME ":" $0; }' myfile.txt 我尝试在wordA和wordB的左右两侧添加\y,但在我的测试中无效。 我试过:/\ywordA\y/&/\ywordB\y/ 谢谢大家 (注:我是awk新手,所以我试图避免使用match()函数。)是否要使用gawk而不是awk: gawk '{$0=tolower($0)};/\ywo

我想将单词边界添加到此awk命令:

awk '{$0=tolower($0)};/wordA/&&/wordB/ { print FILENAME ":" $0; }' myfile.txt
我尝试在
wordA
wordB
的左右两侧添加
\y
,但在我的测试中无效。
我试过:
/\ywordA\y/&/\ywordB\y/

谢谢大家


(注:我是awk新手,所以我试图避免使用match()函数。)

是否要使用gawk而不是awk:

gawk '{$0=tolower($0)};/\ywordA\y/&&/\ywordB\y/ { print FILENAME ":" $0; }' myfile.txt

如果您的系统出现问题(例如,在Mac OS X上),将执行您想要的操作\y是awk的GNU扩展。

这可能适用于您:

awk'{$0=tolower($0)}/[[::]/&&/[::]/{打印文件名“$0;}”myfile.txt
但由于它在linux上无法工作,所以最好安装GNU awk

  • GNU awk还支持单词边界的
    \
    约定
  • 在Mac上,/usr/bin/awk版本20070501不支持[[::]]
  • 如果您被顽固的awk困住了,那么由于awk通常会将行拆分为令牌,因此使用以下命令可能是有意义的:

    虚词(s,i){
    
    对于(i=1;i您的花括号似乎没有正确平衡;您的
    }
    s比
    {
    s多。我只知道一个版本的awk能够理解
    \b
    单词边界:当您运行a2p时得到的边界。:)我也尝试了\b,但没有工作(mac osx).@bookedbyprimes你不懂。
    a2p someawkcode | perl
    是awk-to-perl转换器。这样你就可以得到真正的perl正则表达式。
    awk '{$0=tolower($0)};/[[:<:]]wordA[[:>:]]/&&/[[:<:]]wordB[[:>:]]/ { print FILENAME ":" $0; }' myfile.txt
    
    /\<[abc]\>/ { print "matched"; }
    
    word("[abc]") { print "matched"; }