web-dev-qa-db-ja.com

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

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」として空行を使用する--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"などの他の機能も機能しませんでした。

8
fedorqui

ああ、私はそれを見つけました、$''の代わりに$""構文を使用するだけです:

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



something else
hello hello
bye

man bashから:

引用

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

(...)
\n     new line
12
fedorqui

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

1
Pandya