我有一个文件需要获取标签内的内容。例如:
<Model500>
ABC
BCD
CDE
</Model500>
<Model500>
123
234
345
</Model500>
我想提取其中的内容
<Model500>
</Model500>
使用“sed”
所以它看起来像
ABC
BCD
CDE
123
234
345
我尝试过使用
sed -e 's/<Model>\,/</Model>/p' file.txt
但特殊字符引起了问题。有什么建议吗?谢谢。
答案1
如果输入是 XML,那么最好使用 XML 特定的工具。
方法一
在 sed 正则表达式中包含 a 的一种方法/
是使用反斜杠对其进行转义:
$ sed -ne '/<Model500>/,/<\/Model500>/p' file.txt
<Model500>
ABC
BCD
CDE
</Model500>
<Model500>
123
234
345
</Model500>
该表达式/<Model500>/,/<\/Model500>/
指定行的范围。该范围以匹配的行开始<Model500>
,并以匹配的行结束<\/Model500>
。由于我们指定一个范围,而不是替代命令,因此表达式不以 开头s
。
方法二
如果您不想转义它,可以使用不同的分隔符:
$ sed -ne '\|<Model500>|,\|</Model500>|p' file.txt
<Model500>
ABC
BCD
CDE
</Model500>
<Model500>
123
234
345
</Model500>
在这里,我们用作|
分隔符。要表明/
范围中使用了除分隔符之外的分隔符,应将第一个分隔符转义:\|
。
答案2
由于字符串</Model>
包含该/
字符,因此您需要在 sed 表达式中对其进行转义,或者使用不同的字符来分隔 sed 表达式。幸运的是,sed 可以使用任何单个字符来分隔表达式,因此您只需选择一个不出现在输入中的字符即可。
更一般地说,sed 可能不是当前任务的最佳选择。您似乎正在解析一个 XML 文件,因此您可能应该利用为 XML 解析构建的库,而不是与 sed 一起破解某些内容。看这个帖子了解为什么这是一个坏主意。