【问题标题】:Insert contents of a file after specific pattern match在特定模式匹配后插入文件内容
【发布时间】:2013-05-18 21:33:30
【问题描述】:

我想在特定模式匹配处插入文件内容。下面是一个示例:在file1.txt 中在<tag></tag> 之间添加file2.txt 内容。

file1.txt

<html>
<body>
<tag>
</tag>
</body>
</html>

file2.txt

Hello world!!

我已经尝试过,但没有成功。

# sed "/\<tag\>/ {
h
r file2.txt
g
N
}" file1.txt

<html>
<body>
Hello World!!
<tag>
</tag>
</body>
</html>

【问题讨论】:

  • 您可以将&lt;tag&gt; 更改为&lt;/tag&gt;,因为它正在打印之前 &lt;tag&gt;
  • 我已经尝试过'/&lt;\/tag&gt;/ 并且有效!!!万岁..

标签: regex linux sed


【解决方案1】:

尝试以下命令:

sed '/<tag>/ r file2.txt' file1.txt

它产生:

<html>
<body>
<tag>
Hello world
</tag>
</body>
</html>

EDIT 解释为什么您的命令不能按您希望的方式工作:r filename 命令在当前循环结束或读取下一个输入行时添加其内容。而您正在使用 N 命令,该命令不打印任何内容,但会读取下一行,因此此时会打印 Hello world,然后打印正常的行流。

在我的例子中,它读取带有&lt;tag&gt; 的行,然后结束循环,因此打印该行,然后打印文件的内容并继续读取直到结束。

【讨论】:

  • 有没有办法用 CDATA 包装内容?
  • 我需要添加-i.bak 来写入file1.txt。 sed -i.bak '/&lt;tag&gt;/ r file2.txt' file1.txt
  • 无论如何要在&lt;\tag&gt; 之后插入这项工作?我尝试使用&lt;\\tag&gt; 转义反斜杠,但它不起作用。请在此处查看我的问题以获取更多信息:stackoverflow.com/questions/46715401/…
  • 有没有办法可以包含包含文件的完整路径(file2.txt 应该类似于 /tmp/file2.txt)。我尝试转义没有用的正斜杠
  • @Birei 是否可以不打印'Hello World!!'行,只需插入文件的内容。我可以想象如何通过第二次扫描 sed 来删除这一行,问题是这是否可以在一次扫描中完成。
猜你喜欢
  • 2019-05-12
  • 2023-01-22
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
相关资源
最近更新 更多