正则匹配多行sed跨⾏匹配替换
有⽂本
123
456kaishi33333
ddd
jieshu66666
ddd
444444
想把从kaishi到jieshu中的内容⼀次替换为COMMENT
sed -e "{:begin;  /jieshu/! { $! { N; b begin }; }; s/kaishi.*jieshu/COMMENT/; };"
执⾏后的内容为:
123
456COMMENT66666
ddd
444444
⼤括号⾥应该是⽤了sed语法编程
:begin,这是⼀个标号,man中叫做label,也就是跳转标记,供b和t命令⽤,本例中使⽤了b命令。
/jieshu/!是要替换内容的结束标记,带上!就是说当⼀⾏处理完毕之后,如果没有发现结束标记就继续,jieshu就是你要结束的搜索词$!,$在正则中表⽰字符串结尾,在sed中代表⽂件的最后⼀⾏,本句和上⼀句结合起来的意思就是:如果在本⾏没有发现结束标记,并且当前扫描过的⾏并不是⽂件的最后⼀⾏。
N;,把下⼀⾏的内容追加(append)到缓冲区(pattern)之后,在我们的例⼦中,在处理456kaishi33333这⼀⾏的内容时,就会执⾏到这⾥,然后把下⼀⾏的内容ddd,依次类推把
jieshu66666⼀起放⼊缓冲区,相当于“合并”成了⼀⾏(sed的缓冲区中默认都只会包含⼀⾏的内容)。
b begin,由于仍然没有到结束标记jieshu(注意上⼀条说的缓冲区还没有被处理),所以在这⾥跳回到标号begin,重新开始命令。
如果开始和结束标记之间间隔了多⾏,那么就会有多次跳转发⽣。
s/kaishi.*jieshu/COMMENT/;,终于,/jieshu/!不再匹配成功,也就是我们已经到了结束标记,那么⽤s命令来进⾏替换。如果开始和结束标记在⼀⾏的话,就会越过上⾯那些复杂的处理,直接执⾏到这⾥了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。