我想为这个awk命令添加单词边界:
awk '{$0=tolower($0)};/wordA/&&/wordB/ { print FILENAME ":" $0; }' myfile.txt
我尝试在\y
和wordA
的左右两侧添加wordB
,但在我的测试中无效。
我试过这个:/\ywordA\y/&&/\ywordB\y/
全部谢谢!
(ps:我是awk的新手所以我试图避免使用match()函数。)
答案 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)
\<
和\>
约定。 如果你遇到了一个顽抗的awk,那么因为awk通常会将行分成标记,所以使用它可能是有意义的:
function word(s, i) {
for (i=1;i<=NF;i++) {if ($i ~ "^" s "$") {return i}};
return 0;
}
所以,例如,而不是写
/\<[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。