Grep中的行号

时间:2014-11-21 10:18:56

标签: linux bash grep

我在Grep中有命令:

cat nastava.html | grep  '<td>[A-Z a-z]*</td><td>[0-9/]*</td>'  | sed 's/[ \t]*<td>\([A-Z a-z]*\)<\/td><td>\([0-9]\{1,3\}\)\/[0-9]\{2\}\([0-9]\{2\}\)<\/td>.*/\1 mi\3\2 /' 
|sort|grep -n ".*" | sed -r 's/(.*):(.*)/\1. \2/' >studenti.txt

我不明白第二行,排序是好的,grep -n意味着num那个排序列表,但为什么我们在这里使用“。*”?没有它就行不通,我不明白为什么。

2 个答案:

答案 0 :(得分:4)

grep纯粹用于此处使用-n选项的行号的副作用,因此最重要的是使用匹配所有输入行的正则表达式。因此,.*不是很优雅 - ^可以在不扫描每一行的情况下工作,$也可以轻松匹配每一行。既然你知道输入行不是空的,因此至少包含一个字符,那么简单的正则表达式.也可以很好地工作。

但是,最终目标是执行行号,更好的解决方案是使用专用工具。

... | sort | nl -ba -s '. '

-ba选项指定对所有行进行编号(默认是仅向非空行添加行号;我们知道没有空行,因此这里不一定非常必要,但它对于知道)和-s选项指定要放在数字后面的分隔符字符串。

可能的一个小问题是行号格式是空白填充的,所以最后,如果您特别想要未填充数字,此解决方案可能不适合您。 (但是sed后处理器来解决这个问题要比现在的grep后处理器简单得多 - 只需sed 's/^ *//'就会删除前导空格。)

......顺便说一句,丑陋的cat | grep | sed管道可以缩写为

sed -n 's%[ \t]*<td>\([A-Z a-z]*\)</td><td>\([0-9]\{1,3\}\)/[0-9]\{2\}\([0-9]\{2\}\)</td>.*%\1 mi\3\2 %p' nastava.html

cat从来就不是必需的,sed脚本很容易被重构,只有在执行替换时才打印(您的grep正则表达式不完全相同到sed脚本中的那个,但我认为这是意图)。此外,使用不同的分隔符可避免必须反斜杠。

...当然,如果nastava.html是您自己的网页,整个过程都是umop apisdn。您应该让学生以机器可读的形式获得结果,并从中生成一个网页,而不是相反。

答案 1 :(得分:3)

grep需要正则表达式才能匹配。您根本无法运行grep而无法运行。如果要对所有行进行编号,只需指定与任何内容匹配的表达式。我可能会使用^代替.*