どうやって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文字)で終わる一連の行として扱います。-P
Perl正規表現構文
編集:このバージョンは完全な一致行を印刷します。
grep -o -P -z '(.*)Foo(.*)\n(.*)Bar(.*)' file