如何用Sed脚本移除断字标记(=)并合并拆分的文本行?
解决行尾断字标记=的文本合并问题
哈哈,我懂你这种踩坑的感觉!你之前用的sed 's/=$//g'命令只去掉了行尾的=,但换行符还留在那儿,自然没法把两行真正合并起来。别着急,我给你几个靠谱的解决方案:
方法一:用Sed实现合并
这个Sed命令会自动把所有以=结尾的行和下一行合并,同时移除那个断行的=:
sed -e :a -e '/=$/N; s/=\n//; ta' old-file > new-file
我给你拆解一下每个部分的作用:
:a:定义一个名为a的标签,用来循环处理连续的断行/=$/N:匹配行尾是=的行,把下一行追加到当前行(两行之间用换行符\n分隔)s/=\n//:把行尾的=和后面的换行符一起替换为空,完成合并ta:如果刚才的替换操作成功了,就跳转到标签a,继续处理可能存在的连续断行(比如多行都以=结尾的情况)
举个例子,你的原文件内容:
I wonder who came up with the phrase A qu=
ick brown fox jumps over the lazy dog.
运行命令后,新文件就会变成:
I wonder who came up with the phrase A quick brown fox jumps over the lazy dog.
方法二:用Awk实现合并
如果你更习惯用Awk,这个命令也能达到同样的效果:
awk '/=$/{sub(/=$/,""); getline line; print $0 line; next}1' old-file > new-file
解释一下逻辑:
/=$/:匹配以=结尾的行sub(/=$/,""):移除当前行末尾的=getline line:读取下一行内容到变量line里print $0 line:把当前行和下一行内容拼接后打印next:跳过后续的默认处理,直接进入下一行循环1:对于不匹配/=$/的行,直接默认打印(Awk里1代表真,会执行默认的print $0)
内容的提问来源于stack exchange,提问作者Sandeep
相关产品推荐
相关产品推荐

