grepでグループ区切りとしてmultilineを使用するにはどうすればよいですか?


8

では、グループマッチの間に何かを書くgrepために使用できます--group-separator

これは、特に-C Xコンテキスト行を取得するオプションを使用する場合に、どのブロックがあるかを明確にするのに便利です。

$ cat a
hello
this is me
and this is
something else
hello hello
bye
i am done
$ grep -C1 --group-separator="+++++++++" 'hello' a
hello
this is me
+++++++++
something else
hello hello
bye

空行をgrepのコンテキスト「グループセパレーター」として使用する方法で、空行を作成する方法を学びました--group-separator=""

ただし、2つの空の行が必要な場合はどうなりますか?私は言っ--group-separator="\n\n"てみましたが、リテラル\ns を取得します:

$ grep -C1 --group-separator="\n\n" 'hello' a
hello
this is me
\n\n
something else
hello hello
bye

他のようなものも機能--group-separator="\nhello\n"しませんでした。

回答:


12

私はそれを見つけました、$''代わりに構文を使用する必要があります$""

$ grep -C1 --group-separator=$'\n\n' 'hello' a
hello
this is me



something else
hello hello
bye

からman bash

引用

$ 'string'形式の単語は特別に扱われます。単語は文字列に展開され、バックスラッシュでエスケープされた文字はANSI C規格の指定に従って置き換えられます。バックスラッシュエスケープシーケンスが存在する場合は、次のようにデコードされます。

(...)
\n     new line

1

私が使用することをお勧めecho -eまたはprintf\\n改行のため。

例(とecho -e):

$ grep -C1 --group-separator="$(echo -e line1\\n\\nline2)" 'hello' a
hello
this is me
line1
line2
something else
hello hello
bye

例(とprintf):

$ grep -C1 --group-separator="$(printf hello\\nfedorqui)" 'hello' a
hello
this is me
hello

fedorqui
something else
hello hello
bye

1つの利点は、二重引用符を使用していることです。(したがって、変数の展開などが機能します)


printfまたはを使用する必要はないと思いますecho。あなたの場合、grep -C1 --group-separator=$'hello\nfedorqui' 'hello' a同等です。
fedorqui

@fedorquiはい、冗長な回答を削除します!
Pandya

しかし、努力をありがとう、もし私が見つからなかったなら、$''あなたのものが良い方法だろう!
fedorqui

@fedorquiところで、$'$var'(単一引用符で設定した場合、変数の値を展開/印刷できない!)でエラーが見つかりましたか?一方、"$(echo $var)"働くことができます。
Pandya

はい、そうです。しかし、次に言うことができます$'"$var"'。それは$'+ "$var"+ 'です。
fedorqui
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.