grep - 複数行パターンの作成

grep - 複数行パターンの作成

スクリプト内に複数行でgrepパターンを作成する方法は?bashそう:

grep -o -P '
    (?!<.*?(?<!(href))=")
        https?:\/\/(?!(www\.example\.com)).*?
    (?=(">))
' input.txt

プログラムを書くときにこれを行うことphpができます。これでb​​ashスクリプトでこれを試しましたが、うまくいきません。一行に書くのがとても不便です。

おそらくパターン内の書式を許可するオプションがあります。つまり、grepこのオプションを有効にすると、スペース(スペースと改行)は認識されません。

グレブバージョン:

grep -V
grep (GNU grep) 2.25

答え1

-Pそれにもかかわらず、(?x:)改行文字を無視することはできません。スペースとタブの場合、次のように動作します。

echo abab | grep -P $'(?x:a b a\tb)'

しかし、改行文字は異なる動作をします。

echo ab | grep -P $'(?x:a\nb)'
grep: the -P option only supports a single pattern

少なくともGNU grep 2.16では。

答え2

grepさまざまなパターンを区別するには、改行を使用してください。ただし、パターンを変数に保存し、次に渡す前にスペースを削除できますgrep

$ ws=$' \t\n'
$ pat=$'a b\nc'
$ echo abcd | grep "${pat//[$'\n\t ']}"
abcd

(もっと複雑なものはテストしていません。)

関連情報