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


20

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

回答:


23

現在の行を/&&&key word&&&/明示的に使用して$0、式をパターンに一致するように置き換えます(例:)。

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

または

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

あなたは持っています

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

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


4
それを単純化できることに注意してくださいawk 'toupper($0)~/&&&KEY WORD&&&/ { p = ! p ; next } ; p;' text.txtBEGINブロックは不要です。デフォルトのアクションは印刷でp;あるため、これで十分です。
テルドン

1
BEGIN初期化されていない変数はfalseと評価されるため、「ブロックは必要ありません」。
グレンジャックマン16

最適化をありがとう。私は通常、返信をオリジナルの最小限の変更に制限しようとしますが、新しい結果がよりタイトで非常に読みやすいことは事実です。
-meuh

2
注意:tolower古代(またはそれほど古くない)awkバージョン(例:AIX)システムに存在しますが、toupper常に利用できるわけではありません^^。
オリビエデュラック

16

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

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

これはに固有ですがgawk、meuhによる(より移植性の高い)代替手段よりも読みやすいと思います。それが問題であるかどうかは、もちろん完全にあなた次第です。


1
私は最大のgawkプロジェクトの1つでawkを長年サポートしたかったのですが、大文字と小文字を区別しない検索の数が原因で、gawkが大文字と小文字を区別しない検索トリガーを持たなかったため、開始できませんでした。gensubは、awkで置き換えるのが難しかったもう1つのgawkのみの機能です。しかし、gawkは一部のマシンやディストリビューションに常にデフォルトでインストールされているわけではありませんが、ほとんど常に利用可能ですが、2016年までにawkやposixを変更してそのような標準ツールの機能を少し拡張できなかったのは残念です。
リザード

3
@Lizardx:それが拡張しないことの全体的なポイントです。標準のままにしてください。それ以外の場合は、単に別の標準を作成し、それらの間にいくつかの非互換性があります(ただし、標準の変更を最小限に抑えようとします...それでも、複数の標準はコンピューティングの主な問題の1つです)
Olivier Dulac

2
私は同意しません。慎重に実行することで、すべてのレガシーメソッドをサポートしながら拡張を導入できます。それを怠ると、時間の経過とともに無意味になり始めます。コンピューティングのすべてが進化し、トリックは非常に安定した信頼できる進化を維持することです。Bashはそれを行う良い例であり、非常に信頼性が高く、単に新しい機能を追加します。サポートされるものを使用するほど「2つの標準」ではありません。変更がグローバルに展開されると、最も古いレガシーシステムはサポートされません。
リザード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.