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

如何用sed命令合并包含相同关键字的多行内容?

问题:合并所有包含Job的行到同一行

输入文件file.txt内容如下:

ABC
Job: Farmer
DEFG
Job: Plumber
Job: Teacher
GHIJ

期望输出:

ABC
Job: Farmer,Plumber,Teacher
DEFG
GHIJ

尝试过以下无效命令:

sed '$!N;/Job: /s/\n/,/ file.txt'

解决方案

方法1:使用awk(推荐,逻辑清晰)

执行以下命令:

awk '/^Job:/{
    if (first_job) {
        sub(/^Job: /, "", $0)
        jobs = jobs "," $0
    } else {
        jobs = $0
        first_job = 1
    }
    next
}
{
    if (jobs) {
        print jobs
        jobs = ""
        first_job = 0
    }
    print
}
END {
    if (jobs) print jobs
}' file.txt

工作原理:

  • 匹配以Job:开头的行:首次匹配时直接保存整行;后续匹配时去掉开头的Job: ,将职业内容用逗号追加到缓存变量中。
  • 遇到非Job:行时,先检查是否有缓存的Job内容,有则先打印,再打印当前行,同时重置缓存变量。
  • 最后处理文件末尾可能剩余的未打印Job内容。

方法2:使用sed

执行以下命令:

sed -n '
/^Job:/{
    H
    b
}
{
    x
    s/\nJob: /,/g
    s/^\n//
    p
    x
    p
}
${
    x
    s/\nJob: /,/g
    s/^\n//
    p
}' file.txt

工作原理:

  • 遇到Job:行时,将其追加到保持空间(H命令),然后跳过后续命令。
  • 遇到非Job:行时,交换模式空间和保持空间,把保持空间里的多行Job内容中的\nJob: 替换成逗号,去掉开头的空行后打印;再交换回模式空间打印当前非Job行。
  • 处理文件最后一行时,单独处理保持空间中剩余的Job内容并打印。

原命令无效的原因

  1. 语法错误:命令末尾缺少闭合的斜杠,正确的语法应该是sed '$!N;/Job: /s/\n/,/' file.txt。
  2. 逻辑局限:即使修正语法,该命令仅能合并相邻的两行,无法处理不连续的Job行,还会错误地将非Job行与下一行的Job行合并,完全不符合需求。

内容的提问来源于stack exchange,提问作者MayaDas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 13:18:01