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,我会很感激的)
Perl 来拯救:
perl -ne 'if (/\\$/) { $l .= $_ }
else { print $l, $_ if $l =~ /XXX/;
$l = "";
}' foo.txt
Run Code Online (Sandbox Code Playgroud)
$l作为累加器工作。-n逐行处理输入(参见 sed),如果该行以反斜杠结尾,则将其添加到累加器中,否则,如果匹配 XXX,则打印累加器加上该行,并且清空累加器。
另一种使用 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)
使用 POSIX sed:
$ sed -e '
:1
/\\$/{N
s/\n//
t1
}
/\\/!d
s/\\[[:blank:]]*//g
' file
Run Code Online (Sandbox Code Playgroud)
pcregrep在不改变线路结构的情况下:
pcregrep -M '^(.|\\\n)*XXX(.|\n)*?[^\\]$' file
Run Code Online (Sandbox Code Playgroud)