使用 sed 从 XML 文件中获取特定文本

Jus*_*tin 1 xml sed regular-expression

不知道为什么我没有得到这个。我一直在搜索和测试我的命令几个小时,但我一无所获。

正文是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><result expand="changes,testResults,metadata,logEntries,plan,vcsRevisions,artifacts,comments,labels,jiraIssues" key="EP-ED-JOB1-174" state="Failed" lifeCycleState="Finished" number="174" ....
Run Code Online (Sandbox Code Playgroud)

我只是想拔出 state="Failed" 零件,它也可以是state="Successful".

我已经尝试过一百万种这样的变体:

sed '/state=".*"/p' htmlResponse.txt
Run Code Online (Sandbox Code Playgroud)

但是括号,转义斜杠等似乎与整个文本块相匹配。我的正则表达式有什么问题?

wwo*_*ods 5

撇开强制性的“您确实应该使用适当的 XML 解析器,因为正则表达式的功能不足以解析 XML”评论,我在您的sed行中看到了两个问题:

  1. ".*"将从第一个匹配"到最后一个,因为.匹配"
  2. 如果与正则表达式匹配,该sed命令将/.../p打印整行

对于快速而肮脏的 HTML 抓取 shell 脚本,我建议以下两件事:

  1. 使用"[^"]*"匹配“报价,任何数量的非引号字符,最终报价”
  2. grep -o提取与正则表达式匹配的文件位要容易得多

所以这会让你的命令更像:

grep -o 'state="[^"]*"'
Run Code Online (Sandbox Code Playgroud)

或者,如果您真的必须使用 sed:

sed -n 's/.*\(state="[^"]*"\).*/\1/p'
Run Code Online (Sandbox Code Playgroud)