3

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

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

我尝试\y在左右添加wordAwordB但它在我的测试中不起作用。
我试过这个:/\ywordA\y/&&/\ywordB\y/

谢谢大家!

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

4

3 回答 3

4

您想使用 gawk 而不是 awk:

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

如果您的系统有 gawk(例如在 Mac OS X 上),它将做您想做的事。\y 是 awk 的 GNU 扩展。

于 2012-03-13T00:59:45.177 回答
2
  1. GNU awk 还支持单词边界的\<\>约定。
  2. 在 Mac 上,/usr/bin/awk 版本 20070501 不支持 [[:<:]] 或 [[:>:]]
  3. 如果您遇到顽固的 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"; }
于 2017-01-19T21:02:29.187 回答
0

这可能适用于Mac OS X

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

但是因为它不能在 linux 上运行,所以最好安装 GNU awk。

于 2012-03-13T01:55:39.167 回答