如何将以特定单词开头的行上移合并到上一行?sed命令问题排查
行首匹配特定单词时合并到上一行的实现方法
原命令失效原因
你写的sed命令存在两个核心问题,没法得到预期结果:
- 语法错误:替换规则前缺失开头的单引号,不符合sed的命令语法规范
- 逻辑错误:sed默认逐行读取处理内容,处理当前行时无法直接操作上一行内容;你写的
\r是当前行内的回车符,作用是让光标回到当前行开头,根本无法实现“把当前行挪到上一行末尾”的跨行合并效果。
可用实现方案
sed 实现(最简洁)
直接执行以下命令即可得到预期输出:
sed 'N;s/\nis/ is/;P;D' your_file
命令各部分作用:
N:读取下一行内容追加到当前处理的缓存区,两行内容之间保留原始的换行符\ns/\nis/ is/:匹配到“换行符+行首is”的结构时,把中间的换行符替换成空格,完成两行拼接P:打印缓存区中拼接完成的第一行内容D:清空缓存区中已经打印的内容,剩余内容进入下一轮处理,不会漏过后续行
针对你给出的示例输入,执行命令后的输出完全符合预期:
My name is kuku My name is pupu My name is yoyo
awk 实现(逻辑更直观)
如果更习惯awk的处理逻辑,也可以用下面的命令:
awk '/^is/{print pre, $0; pre=""; next} {if(pre) print pre; pre=$0} END{if(pre) print pre}' your_file
逻辑很简单:遇到以is开头的行,就把之前暂存的上一行内容和当前行拼接打印;如果不是以is开头的行,就先打印之前暂存的内容,再把当前行存为待拼接的上一行,直到所有内容处理完成。
内容的提问来源于stack exchange,提问作者user3835935
相关产品推荐
相关产品推荐

