仅 sh 和 grep 数字

仅 sh 和 grep 数字

我遇到了一个问题,并试图找到一个可行的解决方案。如果我可以使用 bash,这段代码就可以工作:

ls /a|grep ^[0-9]

不幸的是,sh 的情况并非如此,是的,我需要使用 sh。 :) 运行 sh 我得到

ls /a |grep ^[0-9]
[0-9]: not found
Usage: grep -hblcnsviw pattern file . . .

如果我删除 ^ 代码可以工作,但我只需要以数字开头的文件,而不是包含数字的文件。例如,我需要如下文件:

12.00.2
2.222.1234.12

从 grep 手册页我应该能够使用^.

目前我的实现是通过使用:

ls /a|grep -v [a-z]|grep -v [A-Z]

因为这将删除所有包含字符的文件,但如果文件是 .123.33,它仍然会显示。

答案1

像这样的东西应该适合你:

ls /a | egrep "^[0-9]"

根据 @Anthons 的反馈egrep已被弃用,因此您可以使用-E作为普通命令的切换grep

ls /a | grep -E "^[0-9]"

根据 @Stephane 的反馈扩展在这种情况下甚至不需要正则表达式(ERE)。真正重要的是引用 ,以防止它被您正在使用的出现问题^[0-9]的任何版本所解释。/bin/sh因此,这样的事情将是解决您的问题的最简单的方法:

ls /a | grep "^[0-9]"

-或者-

ls /a | grep '^[0-9]'

答案2

我认为sh您指的是 Bourne shell,它是 90 年代中期之前大多数 Unix 系统的 shell,并且/bin/sh在 Solaris 11 之前的 Solaris 上使用。

在 Solaris 10 及更早版本上,不要使用/bin/sh.那壳子来自另一个时代。代替使用/usr/xpg4/bin/sh

Bourne shell 中^有一个别名,是为了|与其前身 Thompson shell 兼容。所以你的命令是这样的:

ls /a|grep |[0-9]

Bourne shell 报告它找不到调用的命令,[0-9]grep抱怨没有收到任何参数。

即使使用标准sh而不是 Bourne shell,我也建议您引用^.例如,当启用扩展全局选项^时,它是一个全局运算符。zsh

无论如何,如果不是^,您必须引用,[0-9]因为它们是通配符。[0-9]将由 shell 扩展到当前目录中名称为单个数字的文件列表。

所以:

ls /a | grep '^[0-9]'

顺便说一下,在 Bourne shell 中

ls /a ^ grep '^[0-9]'

也会起作用。

答案3

你不需要lsgrep为此;你可以使用一个简单的全局 /a/[0-9]*:

echo /a/[0-9]*
ls /a/[0-9]*
grep foo /a/[0-9]*

如果您在脚本中使用它,请注意解析ls输出是一个坏主意

答案4

我同意 l0b0 grep 在这里是一个坏主意,但无论如何,这里是问题的解释和解决方法。在 Solaris 10 及更早版本上,/bin/sh这是一个过时的 shell,除了运行旧脚本之外不应该用于任何其他用途。你真的应该使用ksh,bash/usr/xpg4/bin/sh来代替。

这里的根本原因是^早期 Unix 时代指定管道的原始方式。 Solaris/bin/sh继承了这一考古特征。

解决方法非常简单,只需通过以下方式之一转义插入符即可:

ls /a |grep \^[0-9]

或者

ls /a |grep "^[0-9]"

或者

ls /a |grep '^[0-9]'

相关内容