如何用Linux的sed/awk将字符串列表按空行分组合并为单行
问题描述
我有一个test.txt文件,内容是包含空行(包括连续空行)的字符串列表,如下:
Val1 Val2 Val3 Val4 Val5 Val6
期望输出:
Val1, Val2, Val3 Val4, Val5 Val6
我尝试了以下命令:
cat test.txt | sed 's/<[^>]*>//g' | sed 's/ //g' | sed 's/.*/&/;$!s/$/, /' | tr -d '\n'
但这个命令会把所有内容合并成一行,我需要实现仅将连续的非空字符串用逗号分隔合并为单行,遇到空行则换行(支持连续空行)。
解决方案
你的命令问题出在最后一步的tr -d '\n'——它把所有换行符都删掉了,自然会把所有内容揉成一行。下面提供两种可行的方案:
方案1:使用awk(推荐,逻辑更清晰)
awk ' /^[[:space:]]*$/ { if (line != "") { print line; line = "" } next } { gsub(/^[[:space:]]+|[[:space:]]+$/, ""); # 去掉首尾空格 if (line != "") line = line ", "; line = line $0 } END { if (line != "") print line } ' test.txt
逻辑说明:
- 匹配到空行(包括全是空格的行)时,如果之前已经积累了合并的内容,就打印出来并清空缓存,然后跳过当前行;
- 非空行先去掉首尾的空格,再追加到缓存行中,用逗号分隔;
- 最后处理文件末尾剩余的缓存内容。
方案2:使用sed
sed -e '/^[[:space:]]*$/b output' -e '/^[[:space:]]*$/!{H;$!d}' -e ':output' -e 'x;s/\n/, /g;s/^, //;s/[[:space:]]*\n[[:space:]]*/, /g' test.txt
逻辑说明:
- 遇到空行时跳转到
output标签处理积累的内容; - 非空行先追加到保持空间,直到遇到空行或文件末尾;
- 在
output标签中,把保持空间里的换行替换成逗号分隔,同时清理多余的空格和开头的逗号。
可选调整
如果需要保留你原命令里的s/<[^>]*>//g(移除HTML标签)和s/ //g(移除所有空格)操作,可以整合到awk方案中:
awk ' /^[[:space:]]*$/ { if (line != "") { print line; line = "" } next } { gsub(/<[^>]*>/, ""); # 移除HTML标签 gsub(/[[:space:]]+/, ""); # 移除所有空格 if (line != "") line = line ", "; line = line $0 } END { if (line != "") print line } ' test.txt
内容的提问来源于stack exchange,提问作者sahil
相关产品推荐
相关产品推荐

