KSH Shell脚本匹配文件模式

时间:2017-10-01 05:52:39

标签: shell ksh

我是shell脚本的新手。我想为下面的特定模式迭代一个目录。

Ad_sf_03041500000.dat
SF_AD_0304150.DEL
SF_AD_0404141.EXP

位数应与此模式完全匹配。 我正在使用KSH shell脚本。你能不能请我在for循环中只迭代那些文件。

2 个答案:

答案 0 :(得分:1)

自动通配符生成方法。使用前导文本和行号打印文件名...

  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
    
  2. 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
    
  3. 两种方法的输出:

         1  Here's Ad_sf_03041500000.dat
         2  Here's SF_AD_0304150.DEL
         3  Here's SF_AD_0404141.EXP
    

    如果不想要行号,请省略| nlecho可以替换为需要在文件上运行的任何命令。

    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变体是相同的方法,但使用模式替换settest -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

我使用“选择一个”运算符@(...)将两个较短的模式合并为一个模式,我使用了\dksh支持在括号内的[[:digit:]]的较短版本。