在存在 grep 的世界中,是否有 `sed -n "/regexp/p"` 的用例?

在存在 grep 的世界中,是否有 `sed -n "/regexp/p"` 的用例?

sed -n "/regexp/p"将仅打印匹配的行regexp而不打印其他行。这似乎与所做的完全等同grep。我看到使用此构造的唯一用例是,grep如果您已经在 sed 内部执行某些操作并且通过管道传输到另一个程序会很笨拙。

有人能想到他们会使用这个构造的其他原因吗grep

答案1

该命令sed -n '/re/p'(或sed '/re/!d',不使用-n在每个循环结束时抑制默认输出)与 相同grep -e 're',并且两者都可以追溯到ed编辑器的g/re/p命令(“全局匹配re并打印”);以像这样的基本方式使用sedand就像在.grepged

如果您只想打印与特定正则表达式匹配的行,请使用grep.这就是作用grep。这是它最基本的任务。如果您使用grep而不是sed用于此任务,它将使您的 shell 代码更清晰、更易于理解和维护。

如果它是某个较长编辑脚本的一部分,请使用/re/pin 。除非您有一些非常特殊和古怪的要求,否则不要进行管道输入或反之亦然。sedsedgrepsed

请注意,命令/re/中的sed地址。它寻址与特定正则表达式匹配的所有行。使用/re/p,它会打印这些行。换句话说,/re/是命令的地址p

地址也可以是行号,或者由两个行号、两个正则表达式或其组合描述的范围。例如,您可以使用sed -n '5,/re/p'打印从第 5 行到任何匹配的行的所有行re。该grep实用程序不具备此功能,该功能是seded编辑器继承的。

总之:grep是更适合提取与特定正则表达式匹配的行的工具。要提取匹配更复杂条件(例如在某个范围内)的行,请使用sedawk

答案2

注意尺寸:

$ ls -lh /bin/grep /bin/sed
-rwxr-xr-x 1 root root 207K Apr 29  2016 /bin/grep
-rwxr-xr-x 1 root root  72K Feb 11  2016 /bin/sed
$

grep使用的内存多于sed

以及执行时间(实际):

$ time date | grep Apr
Fri Apr 17 13:31:11 PDT 2020

real    0m0.035s
user    0m0.000s
sys     0m0.016s
$ time date | sed -n '/Apr/p'
Fri Apr 17 13:31:29 PDT 2020

real    0m0.028s
user    0m0.000s
sys     0m0.016s
$

看看怎么样sed是不是快了一点?

在资源受限的嵌入式环境中,这可能很重要。

相关内容