簡體   English   中英

如何在不使用match()函數的情況下在awk中使用單詞邊界?

[英]How to use word boundaries in awk without using match() function?

我想為這個awk命令添加單詞邊界:

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

我嘗試在wordAwordB左右wordA添加\\y ,但它在我的測試中不起作用。
我試過這個: /\\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擴展。

  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"; }

這可能適用於Mac OS X

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

但是因為它不適用於linux,所以最好安裝GNU awk。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM