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
使用でき、フラグを使用して複数行を入力できます。pcregrep
grep -P
x
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