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

如何使用sed命令仅替换第一个匹配的文本块

用sed替换第一个<<EOF/EOF文本块为file2内容

需求

将file1中第一个以<< EOF为起始标记、EOF为结束标记的文本块,替换为file2中的数据,其余内容保持不变。

示例文件

file1

resource "policy" "temp1" { 
 policy = << EOF
 {
  policy1-data
 }
 EOF
}

resource "policy" "temp2" { 
 policy = << EOF
 {
  policy2-data
 }
 EOF
}

file2

{
  modified-policy-data
}

期望输出

resource "policy" "temp1" { 
 policy = << EOF
 {
  modified-policy-data
 }
 EOF
}

resource "policy" "temp2" { 
 policy = << EOF
 {
  policy2-data
 }
 EOF
}

错误命令(替换所有块)

你之前尝试的命令会替换所有匹配的块:

lead='<<EOF'
tail='EOF'
sed -nie '/"$lead"'/ { p r file2 :a n /'"$tail"'/ { p b } ba }p' file1

正确命令

以下命令仅替换第一个匹配的文本块:

lead='<< EOF'
tail='EOF'
sed -e "/$lead/{
    p
    r file2
    :a
    n
    /$tail/!ba
    p
    b done
}
:done
p" file1 > output.txt

命令逻辑说明

  1. 当匹配到第一个起始标记$lead时,执行以下操作:
    • p:打印当前的起始标记行
    • r file2:读取并输出file2的全部内容
    • 进入循环(标签a),持续读取下一行,直到匹配到结束标记$tail
    • 打印结束标记行,然后跳转到done标签
  2. 进入done标签后,后续所有行直接打印,不再触发起始标记的匹配逻辑,确保只处理第一个文本块。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:57:18