如何用另一个文本文件替换标记之间的文本文件的一部分?

smo*_*ris 32 unix bash shell-script textfiles text-processors

假设我有一个这样的文本文件:

# custom content section
a
b

### BEGIN GENERATED CONTENT
c
d
### END GENERATED CONTENT
Run Code Online (Sandbox Code Playgroud)

我想GENERATED CONTENT用另一个文件的内容替换标签之间的部分。

什么是最简单的方法来做到这一点?

Pet*_*r.O 38

lead='^### BEGIN GENERATED CONTENT$'
tail='^### END GENERATED CONTENT$'
sed -e "/$lead/,/$tail/{ /$lead/{p; r insert_file
        }; /$tail/p; d }"  existing_file
Run Code Online (Sandbox Code Playgroud)

  • `r insert_file` 命令必须是其行中的最后一件事。*注意*后面不允许有空格和注释。代码使用 GNU `sed` 进行了测试,并启用了 `--posix` 选项,它按预期工作,因此它应该可以与任何 *posix 兼容* `sed` 一起使用。 (3认同)
  • 有人可以解释命令。 (3认同)
  • 请注意,就地编辑要求您捕获 sed 的输出(例如 `output=$(sed -e "..." existing_file)`),然后在第二遍中执行替换(例如 `echo "$output" > existing_file`) 因为尝试重定向到您正在读取的文件将导致它在读取内容之前被截断。 (2认同)

smo*_*ris 7

newContent=`cat new_file`
perl -0777 -i -pe "s/(### BEGIN GENERATED CONTENT\\n).*(\\n### END GENERATED CONTENT)/\$1$newContent\$2/s" existing_file
Run Code Online (Sandbox Code Playgroud)


小智 5

使用heredoc和ed行编辑器:

ed -s FILE1 <<EOF
/### BEGIN GENERATED/+,/### END GENERATED/-d
/### BEGIN GENERATED/ r FILE2
w
q
EOF
Run Code Online (Sandbox Code Playgroud)

Heredoc 中的第一行是删除 ( ) thed之后的行和 ( ) the之前的行+### BEGIN GENERATED-### END GENERATED...

第二行是插入FILE2到该行之后### BEGIN GENERATED