我在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那个排序列表,但为什么我们在这里使用“。*”?没有它就行不通,我不明白为什么。
答案 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
而无法运行。如果要对所有行进行编号,只需指定与任何内容匹配的表达式。我可能会使用^
代替.*
。