Shell在两种模式之间找到一个字符串

时间:2016-10-11 13:57:05

标签: bash shell awk sed

我有一个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,但所有上述特殊承租人都有问题,是否可以选择将文本视为简单的租船人?

2 个答案:

答案 0 :(得分:3)

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表达式。更具体地说,似乎你想要 检索<att id="subType">,这应该很容易表达。 在您的示例周围添加了<test></test>,我可以使用xmllint来检索该值。

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

答案 1 :(得分:0)

使用Perl:

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

输出:

</att><att id="subType"><val>null</val></att>

说明:

  • $1是捕获的字符串(.*)
  • 此处使用
  • m##作为匹配运算符而非标准Perl //,以便忽略特殊的/字符
相关问题