我想为这个 awk 命令添加单词边界:
awk '{$0=tolower($0)};/wordA/&&/wordB/ { print FILENAME ":" $0; }' myfile.txt
我尝试\y
在左右添加wordA
,wordB
但它在我的测试中不起作用。
我试过这个:/\ywordA\y/&&/\ywordB\y/
谢谢大家!
(ps:我是 awk 的新手,所以我试图避免 match() 函数。)
我想为这个 awk 命令添加单词边界:
awk '{$0=tolower($0)};/wordA/&&/wordB/ { print FILENAME ":" $0; }' myfile.txt
我尝试\y
在左右添加wordA
,wordB
但它在我的测试中不起作用。
我试过这个:/\ywordA\y/&&/\ywordB\y/
谢谢大家!
(ps:我是 awk 的新手,所以我试图避免 match() 函数。)
您想使用 gawk 而不是 awk:
gawk '{$0=tolower($0)};/\ywordA\y/&&/\ywordB\y/ { print FILENAME ":" $0; }' myfile.txt
如果您的系统有 gawk(例如在 Mac OS X 上),它将做您想做的事。\y 是 awk 的 GNU 扩展。
\<
和\>
约定。如果您遇到顽固的 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"; }
这可能适用于Mac OS X:
awk '{$0=tolower($0)};/[[:<:]]wordA[[:>:]]/&&/[[:<:]]wordB[[:>:]]/ { print FILENAME ":" $0; }' myfile.txt
但是因为它不能在 linux 上运行,所以最好安装 GNU awk。