Mac终端Perl命令无法替换换行+foo为bar的问题求助
解决Mac终端中替换换行后接指定字符串的问题
问题原因
你用的perl -pi -w -e 's/\nfoo/bar/g;' file无效,是因为Perl的-p模式默认逐行处理文本:每次只读取一行内容,换行符会被当作行分隔符排除在当前处理的行外,所以永远匹配不到\nfoo这种跨行的组合。
解决方案
方法1:用Perl一次性读取整个文件
通过-0777参数修改Perl的输入记录分隔符,让它一次性读取整个文件内容,这样就能匹配到文件中所有的换行符后跟foo的组合:
perl -pi -0777 -w -e 's/\nfoo/bar/g;' file
针对你的测试文件:
原内容:
foo1 foo
执行命令后会变成:
foo1bar
方法2:用BSD sed(Mac自带)实现同样效果
Mac自带的是BSD版本的sed,需要先把整个文件读入缓冲区再进行替换,命令如下:
sed -i '' -e ':a;N;$!ba;s/\nfoo/bar/g' file
-i '':原地编辑文件,空字符串表示不生成备份文件(如果需要备份,可改为-i .bak):a;N;$!ba:循环读取所有行到缓冲区,实现整文件处理s/\nfoo/bar/g:替换所有换行符后跟foo的内容为bar
内容的提问来源于stack exchange,提问作者Valerio
相关产品推荐
相关产品推荐

