如何用awk/sed/grep合并非逗号开头的续行至前一行
合并多行短信内容为单行的实操方案
下面提供两种常用工具的实现方法,直接复制命令即可运行,处理后的每条短信会完整显示在单独一行:
使用awk处理
awk是处理这类文本场景最直观的工具,逻辑清晰易调整:
awk ' /^,/ { if (line != "") print line line = $0 next } { gsub(/^[[:space:]]+|[[:space:]]+$/, "") if ($0 != "") line = line " " $0 } END { if (line != "") print line } ' input.txt > output.txt
逻辑说明:
- 匹配以逗号开头的行(每条短信的起始行):若之前已积累了上一条短信的内容,则先输出;然后将当前行作为新的内容起点。
- 非起始行:先移除首尾空白(避免多余空格),若不是空行则追加到当前积累的短信内容末尾。
- 最后处理完所有行,输出最后一条短信内容。
使用sed处理
sed通过多行模式空间操作实现合并,适合喜欢单条命令的场景:
sed -e '/^,/!{H;$!d;}' -e 'x;s/\n[[:space:]]*/ /g' input.txt | sed '/^$/d' > output.txt
逻辑说明:
- 第一部分:将所有不以逗号开头的行暂存到保持空间,非最后一行不输出。
- 第二部分:交换模式空间与保持空间,把换行符及后续空白替换为单个空格,完成内容合并。
- 最后通过管道调用sed移除空行(若不需要可去掉后半段)。
处理效果示例
原输入:
, NAME +18001112222, RECV, Text message contents. , NAME +18001112222, RECV, Text message contents that are run over to the line below it. , NAME +18001112222, SENT, Text message contents that have multiple lines and empty lines! , NAME +18001112222, SENT, Text Message contents
处理后输出:
, NAME +18001112222, RECV, Text message contents. , NAME +18001112222, RECV, Text message contents that are run over to the line below it. , NAME +18001112222, SENT, Text message contents that have multiple lines and empty lines! , NAME +18001112222, SENT, Text Message contents
内容的提问来源于stack exchange,提问作者Lincoln Washington
相关产品推荐
相关产品推荐

