Grep的图案

时间:2011-06-23 03:16:14

标签: html shell

我有一个包含以下代码的HTML文件

<html>
  <body>
    Test #1 '<%aaa(x,y)%>'
    Test #2 '<%bbb(p)%>'
    Test #3 '<%pqr(z)%>'
  </body>
</html>

请帮我一个命令的正则表达式(grep或awk),它显示输出如下:

'<%aaa(x,y)%>'
'<%bbb(p)%>'
'<%pqr(z)%>'

3 个答案:

答案 0 :(得分:1)

我认为sed是比awk更好的选择,但并不完全明确。

sed -n '/ *Test #[0-9]* */s///p' <<!
<html>
  <body>
    Test #1 '<%aaa(x,y)%>'
    Test #2 '<%bbb(p)%>'
    Test #3 '<%pqr(z)%>'
  </body>
</html>
!

您无法使用grep;它返回与模式匹配的行,但通常不会编辑这些行。

您可以使用awk

awk '/Test #[0-9]+/ { print $3 }'

模式匹配测试线并打印第三个字段。它起作用,因为在第三个测试字段后面没有空格。如果那里可能有空格,则sed脚本更容易;它已经处理了它们,而awk脚本必须被修改才能正确处理它们。


根据评论判断,所需的输出是“<%”和“%>”之间的材料。因此,我们像以前一样使用sed

sed -n '/.*\(<%.*%>\).*/s//\1/p'

在符合“任何内容 - <% - 任意内容 - %> - 任何内容”的行上,将整行替换为“<%”和“%>”之间的部分(包括标记)并打印结果。请注意,如果线上有多个匹配的图案,则只打印最后一个图案。 (问题和评论不包括在这种情况下要做什么,所以这是可以接受的。替代方案很难,最好用Perl或Python来处理。)

如果必须保留行上的单引号,那么你可以使用其中任何一个 - 我使用第一个带有正则表达式的双引号,但它们都有效并且是等效的。 OTOH,如果正则表达式中存在涉及$符号或反向标记的表达式,则单引号更好;在shell级别的单引号字符串中没有元字符。

sed -n "/.*\('<%.*%>'\).*/s//\1/p"
sed -n '/.*\('\''<%.*%>'\''\).*/s//\1/p'

序列'\''是将单引号嵌入shell脚本中的单引号字符串的方式。第一个引号终止当前字符串;反斜杠引号生成一个引号,最后一个引号启动一个新的单引号字符串。

答案 1 :(得分:0)

grep的-o选项是您想要的:

grep -o "'.*'" filename

答案 2 :(得分:0)

grep -P "^Test" 1.htm |awk '{print $3}'