使用 sed 将行替换为文件内容

Replace line with file content using sed

我正在尝试用另一个文件的内容替换文件中的一行,并打印结果。

#!/bin/sh

set -e

echo "a
b
c" > template.txt
echo "Hello, World!" > foo.txt

sed -e '/b/ {
  d
  r /dev/stdin
}' "template.txt" < "foo.txt"

不幸的是,这导致

a
c

当我删除 sed 脚本中的 d 行时,我可以得到

a
b
Hello, World
c

如何删除 b 并保留 Hello, World

谢谢 ToxicFrog 的回答。显然,d 的意思是“清除模式 space 并立即进入下一行”,所以我需要这些命令的顺序相反。 r 立即将文件内容附加到输出,而不是将其读入模式 space.

sed -e '/b/ {
  r /dev/stdin
  d
}' "template.txt" < "foo.txt"

这可能适合您 (GNU sed):

sed '/b/cHello World!' file

将包含 b 的任何行更改 (c) 为 Hello World!