Bash 脚本 - 输出标签内的文本

Bash 脚本 - 输出标签内的文本

我有一个文件需要获取标签内的内容。例如:

<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 一起破解某些内容。看这个帖子了解为什么这是一个坏主意。

相关内容