我正在尝试编写一个处理 .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
- 更新动作