我正在使用 Sun Solaris 10 操作系统,这是grep -o
现代系统不允许的。我有以下目录列表,我试图获取DATA[0-9]
仅以以下内容开头的任何目录
DATA34016
DATA34011
DATA34029
DATA34027
DATA34014
DATA34013
DATA34010
DATA34006
DATA34008
DATA34007
DATA34026
DATA34009
DATA34015
DATA34017
DATA34012
DATA34028
DATA34067
DATA34066
DATA34046
DATA34046dsd
DATA34046ttidid
预期结果 :
DATA34016
DATA34011
DATA34029
DATA34027
DATA34014
DATA34013
DATA34010
DATA34006
DATA34008
DATA34007
DATA34026
DATA34009
DATA34015
DATA34017
DATA34012
DATA34028
DATA34067
DATA34066
DATA34046
我的命令也遇到的主要问题DATA34046dsd
是DATA34046ttidid
命令 :
for i in $(ls -d */ | grep ^'DATA[0-9]'); do echo ${i%%/}; done
答案1
您可以简单地awk
与范围运算符一起使用。如果您使用的是非常旧的版本awk
,则可以明确指定范围间隔标志
awk '/^DATA[0-9]{5}$/' file
awk --re-interval '/^DATA[0-9]{5}$/' file
但话虽如此,您永远不应该解析ls
.看为什么不应该解析 ls(1) 的输出,使用 shell 内置的 glob 功能。您可以执行以下操作来对目录名称运行循环
for dir in DATA[0-9][0-9][0-9][0-9][0-9]; do
[ -d "$dir" ] || continue
printf '%s\n' "$dir"
done
答案2
使用zsh
外壳:
setopt extended_glob
for dir in DATA[[:digit:]](#c5)(/); do
print $dir
done
要不就
printf '%s\n' DATA[[:digit:]](#c5)(/)
扩展的通配模式DATA[[:digit:]](#c5)(/)
将匹配以字符串 开头DATA
、后跟五个数字 ( [[:digit:]](#c5)
) 且引用目录 ( (/)
) 的任何名称。