2つの連続した行の内容に基づいてディレクトリを特定する方法は?

2つの連続した行の内容に基づいてディレクトリを特定する方法は?

どうやってgrepできますか?目次「Foo」を含む行の場合ただ次の行に「バー」も含まれている場合は、一致を取得しますか?

答え1

@warl0ckが私に正しい方向を教えてくれましたが、pcregrep私は「is」ではなく「includes」と言い、ファイルではなくディレクトリについて尋ねていました。

これは私にとって効果的なようです。

pcregrep -rMi 'Foo(.*)\n(.*)Bar' .

答え2

grepはデフォルトでこれをサポートしていないようです。代わりに pcregrep を使用してください。

Foo
Bar
Foo
abc

pcregrep -M "Foo\nBar" file

得る:

Foo
Bar

答え3

sedスクリプトの使用:

#!/bin/sed -nf

/^Foo/{
    h         # put the matching line in the hold buffer
    n         # going to nextline
    /^Bar/{   # matching pattern in newline
        H     # add the line to the hold buffer
        x     # return the entire paragraph into the pattern space
        p     # print the pattern space
        q     # quit the script now
    }
}

それを書く:

chmod +x script.sed
printf '%s\n' * | ./script.sed

ここの各行は、printf現在のディレクトリ内のすべてのファイルを表示し、それをsed

ノート:アルファベット順に並べられています。

pattern spaceより有用な情報hold space ここ

キラキラウェブサイトプログラミングには本当に良いものがたくさんありますshell

答え4

私はNathanのソリューションを好むが、pcregrepここではgrepだけを使用するソリューションがあります。

grep -o -z -P  'Foo(.*)\n(.*)Bar' file

オプションの説明:

  • -o一致する部分だけが印刷されます。 include はファイル全体を印刷するので必要です-z(どこかに \0 がない場合)。
  • -z入力を改行文字の代わりにゼロバイト(ASCII NUL文字)で終わる一連の行として扱います。
  • -PPerl正規表現構文

編集:このバージョンは完全な一致行を印刷します。

    grep -o -P -z  '(.*)Foo(.*)\n(.*)Bar(.*)' file

関連情報