Linux Grep中的行号

Linux Grep中的行号,linux,bash,grep,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 ".

我在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
cat nastava.html | grep'[A-Z A-Z]*[0-9/][\t]*\([A-Z A-Z]*\)\([0-9]\{1,3\\)\/[0-9]\{2\\([0-9]\{2\\)./\1 mi\3\2/'
|排序| grep-n.“*”| sed-r的/(.*):(.*)/\1\2/'>studenti.txt

我不明白第二行,排序是可以的,grep-n表示对排序列表进行num,但为什么我们在这里使用“*”?没有它它就无法工作,我不明白为什么。

grep
需要一个正则表达式来匹配。您不能在没有表达式的情况下运行
grep
。如果要对所有行进行编号,只需指定一个匹配任何内容的表达式即可。我可能会使用
^
而不是
*

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

但是,由于最终目标是执行行编号,因此更好的解决方案是为此使用专用工具

... | sort | nl -ba -s '. '
-ba
选项指定对所有行进行编号(默认情况下,仅将行号添加到非空行;我们知道没有空行,因此这里不一定需要,但最好知道,
-s
选项指定要放在编号后的分隔符字符串

一个可能的小问题是行号格式是空格填充的,因此,如果您特别想要未添加的数字,那么这个解决方案最终可能不适用于您。(但是解决这个问题的
sed
后处理器要比现在的
grep
后处理器简单得多——只要
sed的/^*/'
就可以删除前导空格)

。。。另外,丑陋的
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
sed-n的%[\t]*\([A-Z A-Z]*\)\([0-9]\{1,3\}\)/[0-9]\{2\}\([0-9]\{2\}\).%\1 mi\3\2%p'nastava.html
cat
从一开始就不是必需的,而且
sed
脚本可以很容易地重构为仅在执行替换时才打印(您的
grep
正则表达式与
sed
脚本中的正则表达式并不完全相同,但我认为这是您的意图)。另外,使用不同的分隔符可以避免使用反斜杠


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

Nice,the
nl
过滤器!在此之前,我总是使用
cat-n
进行此操作。