如何查找文本、复制它并插入到文件的下一行?

如何查找文本、复制它并插入到文件的下一行?

我正在尝试编写一个处理 .xml 文件的脚本。它必须找到包含某个<title>元素的所有行,复制它,然后粘贴到找到的元素之后的下一行,同时还要更改元素类型。这是一个例子。

原来的:

一些文字
<title>文字1</title>
一些文字
<title>文字2</title>
一些文字

这就是我需要得到的:

一些文字
<title>文字1</title>
<description>文字1</description>
一些文字
<title>文字2</title>
<description>文字2</description>
一些文字

可以用 sed 或 grep (或其他工具)来完成吗?

答案1

sed -E 's%<title>(.*)</title>%<title>\1</title>\n<desc>\1</desc>%g' file.xml应该做你的功课。

进一步解释一下: -E参数告诉sed使用扩展正则表达式,因此您可以使用引用。通常以 sed 的形式替换为 sed s/search/replace/g。由于搜索文本中有斜杠,我们使用%而不是/sed 来标记各个部分,因此我们不必用反斜杠掩盖搜索文本中的斜杠。其余的都是正常的正则表达式内容,\1在替换部分中引用(…)搜索部分中的代码片段。

答案2

XML 解析器/处理器是操作 XML 数据的正确工具。

xmlstarlet解决方案:

示范input.xml内容:

<root>
some text
<title>text 1</title>
some text
<title>text 2</title>
some text </root>

xmlstarlet ed -a '//title' -t elem -n 'description' -v '' input.xml \
 | xmlstarlet ed -u '//description' -x './preceding-sibling::title[1]/text()'

输出:

<?xml version="1.0"?>
<root>
some text
<title>text 1</title><description>text 1</description>
some text
<title>text 2</title><description>text 2</description>
some text </root>

  • ed- 编辑模式

  • -a- 追加动作

  • -u- 更新动作

相关内容