複数行にgrepステートメントを記述できますか?

複数行にgrepステートメントを記述できますか?

1行に1つのパターンを作成してスクリプトを読みやすくしたいと思います。

grep 'foo\|bar\|barz'以下のように変換できる構文はありますか?

grep 'foo\|
      bar\|
      barz'

答え1

パターンパラメータは、実際に改行で区切られたパターンのリストです。これは次の場合も同様ですgrep -F。複数の文字列を検索できます。したがって、次のように書くことができます。

grep 'foo
bar
barz'

ただし、連続した行はインデントしないでください。先行スペースはパターンの一部になります。したがって、パターンリストを-e各パターンの前に別々の引数として渡すことをお勧めします。その後、\行の終わりにatを使用して、コマンド引数間の行にわたってシェルコマンドを分割できますgrep。どちらの構文も同じです。

grep -e 'foo' \
     -e 'bar' \
     -e 'barz'

grepオプションを渡すと-P(PCRE正規表現の場合)、それらのどれも現在のバージョンのGNUでは機能せず、その場合は表示に失敗します。ただし、GNUの代わりにgrep: the -P option only supports a single pattern使用でき、フラグを使用して複数行を入力できます。pcregrepgrep -Px

pcregrep '(?x)
  foo |
  bar |
  barz'

を使用すると、(?x)すべての空白文字(SPCとNLを含む)が無視されるため、必要に応じてコードをインデントできます。

答え2

私はそれが必要だとは思わない|-e行全体に複数のオプションを使用できます。

grep -e foo \
     -e bar \
     -e barz

答え3

Raku(以前のPerl_6)の使用

$ cat foo_bar_barz.txt | raku -ne '.grep(/
| foo
| bar
| barz
/).put;'

#出力:

1. foo
2. bar
3. barz

Perl6(現Raku)プロジェクトの主な理由の1つは、より読みやすいコードを入力できるように正規表現エンジンを書き換えることでした。 Rakuのデフォルトには、トークン間のスペースの挿入、複数行の正規表現の作成、修正されたバージョンの「修飾子」システム(現在は「副詞」と呼ばれる)が含まれます。 [後者の例では、正規表現の末尾に「g」をタグ付けしましたが、今度は「:g」が正規表現の先頭に表示されるので、最初から何を一致させるのかがわかります。]

上記は、あなたが投稿した例のRakuソリューションです。 Rakuでは、|交換演算子がLTM(Longest Token Match)ポリシーを実装しています。また、オプションで「先行」|代替演算子を挿入してトークンをソートするのに役立ちます(上記を参照)。楽はこれが正常だと思います。

以下では、後で何が起こっているのかを知らせるために、m//3つのタグを個別にキャプチャするのではなく、一致演算子を使用していますgrep()。キャプチャは括弧で行われ、番号は次から始まります$0

$ cat foo_bar_barz.txt | raku -ne 'say  m/
| (foo)
| (bar)
| (barz)
/;'

#出力:

「foo」
 0 => 「foo」
「bar」
 0 => 「bar」
「barz」
 0 => 「barz」
Nil

入力ファイルは次のとおりです(正直に説明するために最後に偽の行があります)。

$ cat foo_bar_barz.txt
1. foo
2. bar
3. barz
4. ziggy

https://raku.org/

関連情報