带续行的 grep

Car*_*rós 3 grep sed awk text-processing

我怎么能grep/ awk/sed文件寻找一些模式,并打印整条生产线(包括续行如果匹配的线两端用\

文件foo.txt包含:

something
whatever
thisXXX line \
    has a continuation line
blahblah
a \
multipleXXX \
continuation \
line
Run Code Online (Sandbox Code Playgroud)

我应该执行什么来获得(不一定在一行中,不一定删除多个空格):

thisXXX line has a continuation line
a multipleXXX continuation line
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我正在使用 bash 和 fedora21,所以它不需要符合 POSIX(但如果它是 POSIX,我会很感激的)

cho*_*oba 5

Perl 来拯救:

perl -ne 'if (/\\$/) { $l .= $_ }
          else { print $l, $_ if $l =~ /XXX/;
                 $l = "";
          }' foo.txt
Run Code Online (Sandbox Code Playgroud)

$l作为累加器工作。-n逐行处理输入(参见 sed),如果该行以反斜杠结尾,则将其添加到累加器中,否则,如果匹配 XXX,则打印累加器加上该行,并且清空累加器。


ter*_*don 5

另一种使用 perl 删除前面有\空格的换行符的方法:

$ perl -pe 's/\\\n/ /' file | grep XXX
thisXXX line      has a continuation line
a  multipleXXX  continuation  line
Run Code Online (Sandbox Code Playgroud)

要删除多余的空格,请通过 sed 传递它:

$ perl -pe 's/\\\n/ /' file | grep XXX | sed 's/  */ /g'
thisXXX line has a continuation line
a multipleXXX continuation line
Run Code Online (Sandbox Code Playgroud)


cuo*_*glm 5

使用 POSIX sed:

$ sed -e '
:1
/\\$/{N
  s/\n//              
  t1
}
/\\/!d 
s/\\[[:blank:]]*//g
' file
Run Code Online (Sandbox Code Playgroud)


jim*_*mij 5

pcregrep在不改变线路结构的情况下:

pcregrep -M '^(.|\\\n)*XXX(.|\n)*?[^\\]$' file
Run Code Online (Sandbox Code Playgroud)