我是shell脚本的新手。我想为下面的特定模式迭代一个目录。
Ad_sf_03041500000.dat
SF_AD_0304150.DEL
SF_AD_0404141.EXP
位数应与此模式完全匹配。 我正在使用KSH shell脚本。你能不能请我在for循环中只迭代那些文件。
答案 0 :(得分:1)
自动通配符生成方法。使用前导文本和行号打印文件名...
POSIX shell:
2> /dev/null find \
$(echo Ad_sf_03041500000.dat SF_AD_0304150.DEL SF_AD_0404141.EXP |
sed 's/[0-9]/[0-9]/g' ) |
while read f ; do
echo "Here's $f";
done | nl
ksh
(借用Chepner借来的地点):
set - Ad_sf_03041500000.dat SF_AD_0304150.DEL SF_AD_0404141.EXP
for f in ${*//[0-9]/[0-9]} ; do [ -f "$f" ] || continue
echo "Here's $f";
done | nl
两种方法的输出:
1 Here's Ad_sf_03041500000.dat
2 Here's SF_AD_0304150.DEL
3 Here's SF_AD_0404141.EXP
如果不想要行号,请省略| nl
。 echo
可以替换为需要在文件上运行的任何命令。
POSIX代码如何工作。 OP规范很简单,可以通过一些调整来制作出正确的通配符。例如:
echo Ad_sf_03041500000.dat SF_AD_0304150.DEL SF_AD_0404141.EXP |
sed 's/[0-9]/[0-9]/g'
其中输出了所需的模式(为了清晰起见,添加了换行符):
Ad_sf_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].dat
SF_AD_[0-9][0-9][0-9][0-9][0-9][0-9][0-9].DEL
SF_AD_[0-9][0-9][0-9][0-9][0-9][0-9][0-9].EXP
上面的模式转到find
,它只打印匹配的文件名(当没有文件时不打印模式本身),然后文件名转到while
循环。
(ksh
变体是相同的方法,但使用模式替换,set
和test -f
代替sed
和{{ 1}}。)
答案 1 :(得分:1)
您正在寻找的模式是
Ad_sf_{11}([[:digit:]]).dat
SF_AD_{7}([[:digit:]]).DEL
SF_AD_{7}([[:digit:]]).EXP
请注意{n}(...)
模式与n
以下模式的确切匹配,是ksh
唯一的扩展名(据我所知,甚至不是zsh
提供等价物。)
要迭代匹配的文件,您可以使用
for f in Ad_sf_{11}(\d).dat SF_AD_{7}(\d).@(DEL|EXP); do
我使用“选择一个”运算符@(...)
将两个较短的模式合并为一个模式,我使用了\d
,ksh
支持在括号内的[[:digit:]]
的较短版本。