在正则表达式中使用正负选择的正则表达式可循环访问文件列表

时间:2019-06-16 20:48:28

标签: bash shell glob

我尴尬地努力遍历多个文件,这些文件是根据多个条件(由正则表达式定义)选择的。例如,从下面列出的文件中,我只选择带有txt扩展名的文件,但包含字符串“ cat”的文件除外:

mousecatdog.txt
dogcowfox.gif
dogmousecat.txt
dogmousepig.txt

所以我只想从此列表中获取dogmousepig.txt

我尝试使用否定的前瞻,但出现错误:

syntax error near unexpected token `('

当然,我们查看了论坛上的其他主题,并尝试通过添加括号()或启用shopt -s extglob来解决此问题,但无济于事。

我正在使用mac,脚本在bash中。

 #!/bin/bash
    for FILE in ^((?!cat).)*.txt
     do
      printf "\$FILE\n" 
     done 

2 个答案:

答案 0 :(得分:2)

in之后不能使用正则表达式,但是可以使用全局模式。通过shopt -s extglob,您可以使用扩展模式:

#! /bin/bash
shopt -s extglob
for f in !(*cat*).txt ; do
    printf "$f\n"
done

为防止在没有匹配文件时模式扩展到其自身,您也需要启用nullglob

答案 1 :(得分:1)

Bash使用通配符扩展,而不是示例中的正则表达式。

我看到两个相当简单的解决方案:

1-对正选择使用通配符,对负选择使用RE,就像@Wiktor Stribizew在评论中说的那样:

for FILE in *.txt; do
   if [[ ! $FILE =~ cat ]]; then
      printf "$FILE\n" 
   fi
done

2- grep输出通配符扩展的输出(尽管如果文件名中有空格,这将无法正常工作):

for FILE in `\ls -1 *.txt | grep -v cat`; do
   printf "$FILE\n"
done