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

时间:2012-03-13 00:44:06

标签: regex awk word-boundary

我想为这个awk命令添加单词边界:

awk '{$0=tolower($0)};/wordA/&&/wordB/ { print FILENAME ":" $0; }' myfile.txt

我尝试在\ywordA的左右两侧添加wordB,但在我的测试中无效。
我试过这个:/\ywordA\y/&&/\ywordB\y/

全部谢谢!

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

3 个答案:

答案 0 :(得分:3)

你想使用gawk而不是awk:

gawk '{$0=tolower($0)};/\ywordA\y/&&/\ywordB\y/ { print FILENAME ":" $0; }' myfile.txt
如果您的系统有gawk(例如在Mac OS X上),

将执行您想要的操作。 \ y是awk的GNU扩展。

答案 1 :(得分:1)

  1. GNU awk还支持字边界的\<\>约定。
  2. 在Mac上,/ usr / bin / awk版本20070501不支持[[:&lt;:]]或[[:&gt;:]]
  3. 如果你遇到了一个顽抗的awk,那么因为awk通常会将行分成标记,所以使用它可能是有意义的:

    function word(s, i) { for (i=1;i<=NF;i++) {if ($i ~ "^" s "$") {return i}}; return 0; }

  4. 所以,例如,而不是写

    /\<[abc]\>/ { print "matched"; }
    

    你可以这么容易写:

    word("[abc]") { print "matched"; }
    

答案 2 :(得分:0)

这可能适用于Mac OS X

awk '{$0=tolower($0)};/[[:<:]]wordA[[:>:]]/&&/[[:<:]]wordB[[:>:]]/ { print FILENAME ":" $0; }' myfile.txt

但是因为它无法在Linux上运行,所以最好安装GNU awk。