【问题标题】:Shell find a string btween two patternsShell 在两个模式之间找到一个字符串
【发布时间】:2016-10-12 00:45:16
【问题描述】:

我有一个 curl 命令对一个如下所示的文本文件的响应:

<att id="owner"><val>objs/13///user</val></att><att id="por"><val>objs/8/</val></att><att id="subType"><val>null</val></att><att id="uid"><val>14</val></att><att id="webDavPartialUrl"><val>/Users/user%

我需要找到字符串>objs/8/</val><att id="uid">之间的字符串

我尝试过 awk、sed 和 grep,但都遇到了上述特殊承租人的问题,是否可以选择将文本视为简单承租人?

【问题讨论】:

标签: bash shell awk sed


【解决方案1】:

grep-- 一起使用(解释为here

$ grep -o  -- '>objs/8/</val>.*<att id="uid">' pattern
>objs/8/</val></att><att id="subType"><val>null</val></att><att id="uid">

更具体的grep匹配可以参考this question

否则,因为您的输入似乎是 XML,您应该考虑在其上使用 XPATH 表达式。更具体地说,您似乎想要 检索&lt;att id="subType"&gt;,应该很容易表达。 在您的样本周围添加&lt;test&gt;&lt;/test&gt;,我可以使用xmllint 来检索值。

$ xmllint --xpath '/test/att[@id="subType"]' pattern 
<att id="subType"><val>null</val></att>

【讨论】:

  • 我尝试对此进行测试:al&gt;null&lt;/val&gt;&lt;/att&gt;&lt;att id="uid"&gt;&lt;val&gt;14&lt;/val&gt;&lt;/att&gt;&lt;att id="webDavPartialUrl"&gt;&lt;val&gt;/Users/user%" | grep -o -- '&gt;objs/8/&lt;/val&gt;.*&lt;att id="uid"&gt;'
  • 但是响应是空的
  • 虽然grep -o -- '&gt;objs/8/&lt;/val&gt;.*' 确实返回从&gt;objs/8/&lt;/val&gt; 开始的字符串
【解决方案2】:

使用 Perl:

perl -ne 'print "$1\n" if m#&gt;objs/8/&lt;/val&gt;(.*)&lt;att id="uid"&gt;#' file

输出:

&lt;/att&gt;&lt;att id="subType"&gt;&lt;val&gt;null&lt;/val&gt;&lt;/att&gt;

解释:

  • $1 是捕获的字符串(.*)
  • m## 在这里用作匹配运算符,而不是标准 Perl 的 //,以便忽略特殊的 / 字符

【讨论】:

    猜你喜欢
    • 2020-06-03
    • 2021-03-13
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 2013-05-28
    • 1970-01-01
    相关资源
    最近更新 更多