我遇到了一个问题,并试图找到一个可行的解决方案嘘。如果我可以使用 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
你不需要ls
和grep
为此;你可以使用一个简单的全局 /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]'