我尴尬地努力遍历多个文件,这些文件是根据多个条件(由正则表达式定义)选择的。例如,从下面列出的文件中,我只选择带有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
答案 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