2012-03-13 12 views
2

私は、このawkコマンドに単語の境界を追加したい:match()関数を使わずにawkで単語境界を使う方法は?

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

私はwordAwordBの左右に\yを追加しようとしたが、それは私のテストでは動作しませんでした。
私はこれを試しました:/\ywordA\y/&&/\ywordB\y/

ありがとうございます!

(PS:私は、私は試合()関数を避けるためにしようとしていたawkのために新たなんだ)

+2

あなたのカーリー・ブラケットが適切にバランスしていないようです。あなたは '' ''よりも '' '' '' '' '' '' '' '' '' ' – ruakh

+0

私は '\ b'の単語境界を理解するawkのバージョンを知っています:あなたがa2pを通してそれを実行するときに得られるものです。 :) – tchrist

+0

私も\ bと\ を試しましたが、動作していません(mac osx)。 – fooledbyprimes

答えて

3

あなたはawkをするのではなく、gawkを使用したい:

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

は何をあなたを行いますあなたのシステムがgawkを持っている場合(例えば、Mac OS Xの場合)。 \ yはawkのGNU拡張です。

0

これはMac OS Xにあなたのために働くかもしれない:

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

しかし、それはあなたがGNU AWKをインストールオフ最善だLinux上で動作しませんように。

1
  1. GNU awkは、単語境界の表記規則\<および\>もサポートしています。マックは/ usr/binに/ awkのバージョン20070501で
  2. サポートしていません[[:<:]]または[[:>:]]
  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"; } 
関連する問題