2012-02-28 7 views
3

ファイルの行にある指定された単語のいずれかを見つけるためにawkで使用する正規表現があります。これは、awk "/word1/||/word2/||/word3/" filenameのように見えます。あるいは、WORDS="word1 word2 word3"のような単語を指定してから、bash文字列置換を使用して正規表現をawkに渡すようにしています。文字列の代替を使用して正規表現が機能しないのはなぜですか?

私はこれを無駄にするさまざまな方法を試しました。 awkは単にファイル全体の内容をダンプするか、正規表現形式について何らかの苦情を吐き出します。ここで

は、私が持っているものです。

#!/bin/bash 

FILE="myfile" 
WORDS="word1 word2 word3" 

# use BASH string substitution to obtain the regex which should look like this: 
# "/word1/||/word2/||/word3/" 

REGEX=\"/${WORDS// //||/}/\" 

awk ${REGEX} $FILE 

私はそれが引用に関係しているかなり確信していると私は、エコーを使用して様々な方法を試してみましたが、バックダニやエコーとき、それは(右を見て得ることができました)実際にそれを使用しようとすると失敗します。

+0

これはawkと奇妙な正規表現の組み合わせの両方の奇妙な使い方です。あなたは '/ a | b | c /'を取得しようとしているはずです(拡張grepを使って) – Mat

+0

私はこれをcygwinで試しました:regexの特殊文字の前に "\"記号を付けてみてください。このコマンドは私のために働きます: 'awk/\(def \ | abc \)/ abc.txt' - " def "または" abc "を含むすべての行を見つけます。 – user1227804

+0

@Mat。ありがとう。検索結果が私をawkに導きます。 –

答えて

3

は交換してみます。

REGEX=\"/${WORDS// //||/}/\" 

で:彼らは本当に正規表現の一部ではないので、二重引用符をエスケープする必要がないことを

REGEX="/${WORDS// //||/}/" 

注意。

+0

ありがとうございます。それがどうやって*私をエスケープするのか分かりません。 –

関連する問題