首页 > 解决方案 > 提取html标签之间的内容

使用 bash shell 命令

问题描述

我想在 bash 中使用 shell 脚本解析下面的 html 文本字符串。

    <pre style=\"font-family: helvetica, arial, sans-serif; white-space: pre-wrap; margin: 0;\">peter-2</pre>\n                                    <pre style=\"font-family: helvetica, arial, sans-serif; white-space: pre-wrap; margin: 0;\">peter-1</pre>\n                                    <pre style=\"font-family: helvetica, arial, sans-serif; white-space: pre-wrap; margin: 0;\">peter0</pre>\n                                    <pre style=\"font-family: helvetica, arial, sans-serif; white-space: pre-wrap; margin: 0;\">peter1</pre>\n                                    <pre style=\"font-family: helvetica, arial, sans-serif; white-space: pre-wrap; margin: 0;\">peter2</pre>\n                                    <pre style=\"font-family: helvetica, arial, sans-serif; white-space: pre-wrap; margin: 0;\">peter3</pre>\n                                    <pre style=\"font-family: helvetica, arial, sans-serif; white-space: pre-wrap; margin: 0;\">peter4</pre>\n

预期输出:

peter-2
peter-1
peter0
peter1
peter2
peter3
peter4

我希望 shell 命令基于<pre标签而不是基于位置来提取值。

标签: regexbashshellunixgrep

解决方案


假设您的输入总是那么常规,并且由于某种原因您不能使用 XML 解析器,而只是想要一些便宜而愉快的东西,然后使用接受\n替换文本的 sed(例如 GNU sed):

$ sed 's:</pre>:\n:g' file | sed -n 's/.*>//p'
peter-2
peter-1
peter0
peter1
peter2
peter3
peter4

否则在 bash 中使用任何 sed:

$ sed 's:</pre>:\'$'\n'':g' file | sed -n 's/.*>//p'
peter-2
peter-1
peter0
peter1
peter2
peter3
peter4

或任何外壳中的任何 awk:

$ awk '{gsub("</pre>","\n")}1' file | awk 'sub(/.*>/,"")'
peter-2
peter-1
peter0
peter1
peter2
peter3
peter4

推荐阅读