如何使用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
命令逻辑说明
- 当匹配到第一个起始标记
$lead时,执行以下操作:p:打印当前的起始标记行r file2:读取并输出file2的全部内容- 进入循环(标签
a),持续读取下一行,直到匹配到结束标记$tail - 打印结束标记行,然后跳转到
done标签
- 进入
done标签后,后续所有行直接打印,不再触发起始标记的匹配逻辑,确保只处理第一个文本块。
内容的提问来源于stack exchange,提问作者raj
相关产品推荐
相关产品推荐

