我有一个包含以下代码的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)%>'
答案 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}'