Answers:
lead='^### BEGIN GENERATED CONTENT$'
tail='^### END GENERATED CONTENT$'
sed -e "/$lead/,/$tail/{ /$lead/{p; r insert_file
}; /$tail/p; d }" existing_file
r insert_file
命令必须是最后一行。请注意,空格和注释都不允许在其后。该代码已sed
在--posix
启用了该选项的情况下使用GNU 进行了测试,并且按预期工作,因此它应可与所有posix兼容 sed
。
output=$(sed -e "..." existing_file)
),然后在第二遍操作(例如echo "$output" > existing_file
)中执行替换,因为尝试重定向到正在读取的文件将导致它在读取内容之前被截断。
newContent=`cat new_file`
perl -0777 -i -pe "s/(### BEGIN GENERATED CONTENT\\n).*(\\n### END GENERATED CONTENT)/\$1$newContent\$2/s" existing_file
警告:这绝对不是最简单的方法。(编辑:bash起作用; POSIX grep也很好)
如果主要文本在文件“ main”中,而生成的内容在文件“ gen”中,则可以执行以下操作:
#!/bin/bash
BEGIN_GEN=$(cat main | grep -n '### BEGIN GENERATED CONTENT' | sed 's/\(.*\):.*/\1/g')
END_GEN=$(cat main | grep -n '### END GENERATED CONTENT' | sed 's/\(.*\):.*/\1/g')
cat <(head -n $(expr $BEGIN_GEN - 1) main) gen <(tail -n +$(expr $END_GEN + 1) main) >temp
mv temp main
main
在cat读取之前打开以供编写和清除。
ed -s FILE1 <<EOF
/### BEGIN GENERATED/+,/### END GENERATED/-d
/### BEGIN GENERATED/ r FILE2
w
q
EOF
r FILE2
说一句-代替您可以说r !command
要从其他脚本中读取内容。
sed
不仅可以做更多的事情s/.../...
!