You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 01:05:22