web-dev-qa-db-ja.com

awkでの大文字と小文字を区別しない検索

Awkを使用してキーワードを検索する必要がありますが、大文字と小文字を区別しない(大文字と小文字を区別しない)検索を実行したいと思います。

最善の方法は、検索語(「キーワード」)とawkが同時に読んでいるターゲット行の両方を大文字にすることだと思います。から この質問 私はtoupperを使用してすべて大文字で印刷する方法を説明しますが、マッチでそれを使用する方法はわかりません。その答えは印刷を示しているだけなので、変数内の大文字のテキスト。

この入力を前提とした例を次に示します。

blablabla    
&&&Key Word&&&
I want all 
these text and numbers 123
and chars !"£$%&
as output
&&&KEY Word&&&
blablabla

この出力が欲しい:

I want all 
these text and numbers 123
and chars !"£$%&
as output

これは私が持っているものですが、toupperを追加する方法がわかりません。

awk "BEGIN {p=0}; /&&&key Word&&&/ { p = ! p ; next } ; p { print }" text.txt
21
Woeitg

現在の行である/&&&key Word&&&/を明示的に使用して、パターン(つまり$0)を別の式に一致させるように式を置き換えます。

tolower($0) ~ /&&&key Word&&&/

または

toupper($0) ~ /&&&KEY Word&&&/

だからあなたは

awk 'tolower($0) ~ /&&&key Word&&&/ { p = ! p ; next }; p' text.txt

$0のため、一重引用符が必要です。変数はデフォルトで""または0に初期化され、{print}がデフォルトであるため、BEGINブロックを削除できます。以下のコメントで言及されているアクション。

25
meuh

gawkにはIGNORECASE組み込み変数があり、これをゼロ以外に設定すると、すべての文字列と正規表現の比較で大文字と小文字が区別されなくなります。あなたはそれを使うことができます:

BEGIN{IGNORECASE=1}
/&&&key Word&&&/ { foo bar baz }

等。ただし、これはgawkに固有のものですが、私はそれが(より移植性の高い)代替案よりも可読性が高いと感じています。それが問題であるかどうかは、もちろん、完全にあなた次第です。

17
Wouter Verhelst