連続した行でgrep

連続した行でgrep

grep//ファイルawk内の特定のパターンを見つけて行全体を印刷するにはどうすればよいですか(一致する行は?sed\

ファイルfoo.txtには以下が含まれます。

something
whatever
thisXXX line \
    has a continuation line
blahblah
a \
multipleXXX \
continuation \
line

取得するにはどうすればよいですか(必ず1行で書く必要はなく、複数のスペースを削除する必要もありません):

thisXXX line has a continuation line
a multipleXXX continuation line

ところで、私はbashとfedora21を使用しているので、POSIXと互換性がある必要はありません(しかしPOSIXなら感謝します)。

答え1

\Perlを使用して先行する改行とスペースを削除する別の方法:

$ perl -pe 's/\\\n/ /' file | grep XXX
thisXXX line      has a continuation line
a  multipleXXX  continuation  line

余分なスペースを削除するには、sedで渡します。

$ perl -pe 's/\\\n/ /' file | grep XXX | sed 's/  */ /g'
thisXXX line has a continuation line
a multipleXXX continuation line

答え2

POSIX sedの使用:

$ sed -e '
:1
/\\$/{N
  s/\n//              
  t1
}
/\\/!d 
s/\\[[:blank:]]*//g
' file

答え3

pcregrep回路構造を変更せずに:

pcregrep -M '^(.|\\\n)*XXX(.|\n)*?[^\\]$' file

答え4

私のねじれ:

perl -0777 -ne '                           # read the entire file into $_
    s{ [[:blank:]]* \\ \n [[:blank:]]* }   # join continued lines
     { }gx;
    print grep {/XXX/} split /(?<=\n)/     # print the matching lines
' foo.txt 
thisXXX line has a continuation line
a multipleXXX continuation line

関連情報