将文本块替换为文件的内容

将文本块替换为文件的内容

我想用另一个文件 f2 中的数据替换文本文件 f1 中 $Elements$ 和 $EndElements$ 之间的内容。

f1 的内容简单地由下式给出

$Elements$
3
1
5
7
$EndElements$

f2 的内容如下

1 65 71
2 32 87
3 39 98
4 41 63

我最后想得到的是:

$Elements$
1 65 71
2 32 87
3 39 98
4 41 63
$EndElements$

为此,我尝试了 stackexchange 页面中的一些 sed 代码(我复制了代码并且不再打开窗口,所以我无法提供直接链接,抱歉)

lead='^\$Elements\$$' 
tail='^\$EndElements\$$'
# f2 is the file where the information
# to replace is kept in 
sed -e "/$lead/,/$tail/{ /$lead/{p; r insert_file
    >         }; /$tail/p; d }"  f2

这不起作用,基本上什么也不做。

答案1

ed(1)

echo -e '/\$Elements\$/+1,/\$EndElements\$/-1d\n.-1r f2\nw' | ed -s f1

详细地:

  • /\$Elements\$/+1,/\$EndElements\$/-1$Elements$匹配和之间的行$EndElements$
  • d删除所说的行
  • .-1现在是上面的行$EndElements$
  • r f2读取文件f2
  • w写出结果。

答案2

sed -e "
   /$lead/,/$tail/!b
   //!d
   /$lead/r f2
" f1

结果

$Elements$
1 65 71
2 32 87
3 39 98
4 41 63
$EndElements$

在职的

  1. 首先,我们使用,逗号运算符选择适当的范围。
  2. 所有不在此范围内的行都将通过命令按原样打印,b该命令将控制分支到该行的 sed 代码的末尾。
  3. 范围的主体被删除,//!d因为我们打算用自定义文件 f2 替换范围的主体。
  4. 当遇到引导线时,将自定义文件 f2 的内容读入打印队列(请注意,这与模式空间不同。)
  5. 当控制到达 sed 代码末尾时,模式空间的内容(将引导线保持为清空到 stdout),并且在此事件之后,队列的内容将清空到 stdout。

相关内容