假设我有一个像
这样的html输入<li>this is a html input line</li>
我想从以<li>
开头并以</li>
结尾的文件中过滤所有此类输入行。现在我的想法是在第一个字段中搜索模式<li>
,并使用下面的awk命令在最后一个字段中模式</li>
awk '$1 ~ /\<li\>/ ; $NF ~ /\</li\>/ {print $0}'
但看起来没有规定一次匹配两个字段,或者我犯了一些语法错误。你能帮帮我吗?
PS:我正在使用Solaris SunOS机器。
答案 0 :(得分:3)
Solaris上的脚本出现了很多问题:
awk '$1 ~ /\<li\>/ ; $NF ~ /\</li\>/ {print $0}'
/usr/xpg4/bin/awk
。还有nawk
,但它的POSIX功能较少(例如,不支持字符类)。\<...\>
是特定于gawk的单词边界。 Solaris上没有awk可以识别它们。如果你只是想获得文字字符,那么就没有必要逃避它们,因为它们不是regexp元字符。&&
,而不是;
,它只是语句终结符而不是换行符。{print $0}
,因此您无需显式编写该代码。/
是awk regexp分隔符,所以你需要在regexp中间转义它。$1
和$NF
中将为<li>this
和line</li>
,而不是<li>
和{{ 1}}。因此,如果你出于某种原因对DID进行比较,你可以比较多个字段:
</li>
但这可能是你真正想要的:
awk '($1 ~ /^<li>.*/) && ($NF ~ /.*<\/li>$/)'
在这种情况下你可以使用grep:
awk '/^<li>.*<\/li>/'
答案 1 :(得分:1)
为什么不使用正则表达式匹配行的开头和结尾,如
awk '/^[[:space:]]*<li>.*<\/li>[[:space:]]*$/ {print}'
虽然一般情况下如果您正在尝试处理HTML,但您最好使用真正设计用来处理HTML的工具。