gpt4 book ai didi

linux - Grep 中的行编号

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:45:19 27 4
gpt4 key购买 nike

我在 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

第二行没看懂,sort是可以的,grep -n的意思是num那个排序好的list,但是这里为什么要用".*"?没有它就无法工作,我不明白为什么。

最佳答案

grep 纯粹是为了解决带有 -n 选项的行号的副作用,所以最主要的是使用匹配的正则表达式所有的输入线。因此,.* 不是很优雅——^ 无需扫描每一行就可以工作,而 $ 也可以简单地匹配每一行。由于您知道输入行不为空,因此至少包含一个字符,因此简单的正则表达式 . 也可以完美地工作。

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

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

-ba 选项指定给所有行编号(默认是只给非空行加上行号;我们知道没有空行,所以这里不是绝对必要的,但很高兴知道)和 -s 选项指定要放在数字后面的分隔符字符串。

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

...顺便说一句,丑陋的猫|搜索引擎优化 | sed 管道可以缩写为 just

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。您应该让学生的结果以机器可读的形式出现,并从中生成网页,而不是相反。

关于linux - Grep 中的行编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27058987/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com