Regex bash比较正则表达式而不是变量
我想删除字符串中包含子字符串的所有文件,如果不包含子字符串,我想忽略它,所以我使用正则表达式Regex bash比较正则表达式而不是变量,regex,bash,loops,Regex,Bash,Loops,我想删除字符串中包含子字符串的所有文件,如果不包含子字符串,我想忽略它,所以我使用正则表达式 str=9009 patt=*v[0-9]{3,}*.txt for i in "${patt}"; do echo "$i" if ! [[ "$i" =~ $str ]]; then rm "$i" ; fi done 但我有一个错误: *v[0-9]{3,}*.txt rm: cannot remove '*v[0-9]{3,}*.txt': No such fi
str=9009
patt=*v[0-9]{3,}*.txt
for i in "${patt}"; do echo "$i"
if ! [[ "$i" =~ $str ]]; then rm "$i" ; fi done
但我有一个错误:
*v[0-9]{3,}*.txt
rm: cannot remove '*v[0-9]{3,}*.txt': No such file or directory
文件名如下:mari_v9009.txt femme_v9009.txt mari_v9010.txt femme_v9010.txt我假设您使用的是Python 我已经测试了您的正则表达式代码,发现
*
字符不必要。下面的代码似乎工作正常:
v[0-9]{3,}.txt
你能详细说明一下这个问题吗
谢谢,Bren.我假设您正在使用Python 我已经测试了您的正则表达式代码,发现
*
字符不必要。下面的代码似乎工作正常:
v[0-9]{3,}.txt
你能详细说明一下这个问题吗
谢谢,Bren.我刚刚通过管道将错误消息发送到/dev/null。这对我很有用:
#!/bin/bash
str=9009
patt=*v[0-9]{3,}*.txt
rm $(eval ls $patt 2> /dev/null | grep $str)
我刚刚通过管道将错误消息发送到/dev/null。这对我很有用:
#!/bin/bash
str=9009
patt=*v[0-9]{3,}*.txt
rm $(eval ls $patt 2> /dev/null | grep $str)
您需要删除
for
循环中的引号。然后将解释文件名globs:
for i in ${patt}; do echo "$i"
您需要删除
for
循环中的引号。然后将解释文件名globs:
for i in ${patt}; do echo "$i"
这不是regex,这是globbing。看看什么会被扩展:
# echo *v[0-9]{3,}*.txt
*v[0-9]3*.txt femme_v9009.txt femme_v9010.txt mari_v9009.txt mari_v9010.txt
*v[0-9]3*.txt
显然不存在。你能澄清一下你想用{3,}
实现哪些文件吗?否则,它将与您指定的文件名类型相匹配
这不是正则表达式,这是globbing。看看什么会被扩展:
# echo *v[0-9]{3,}*.txt
*v[0-9]3*.txt femme_v9009.txt femme_v9010.txt mari_v9009.txt mari_v9010.txt
*v[0-9]3*.txt
显然不存在。你能澄清一下你想用{3,}
实现哪些文件吗?否则,它将与您指定的文件名类型相匹配
bash文件名扩展不使用正则表达式。看
要查找“v后跟3个或更多数字,后跟.txt”的文件,必须使用bash的扩展模式匹配。
示范:
$ shopt -s extglob
$ touch mari_v9009.txt femme_v9009.txt mari_v9010.txt femme_v9010.txt
$ touch foo_v12.txt
$ for f in *v[0-9][0-9]+([0-9]).txt; do echo "$f"; done
femme_v9009.txt
femme_v9010.txt
mari_v9009.txt
mari_v9010.txt
对于*v[0-9]{3,}*.txt中的i,这个模式的
是:
首先,bash执行
for i in *v[0-9]3*.txt *v[0-9]*.txt
然后,第一个单词*v[0-9]3*.txt
将导致不匹配,bash的默认行为是将模式保留为普通字符串rm
尝试删除名为“*v[0-9]3*.txt”的文件,这会导致“文件未找到错误”
接下来,第二个单词*v[0-9]*.txt将展开,但展开将包括您不想删除的文件。
我错过了问题中的而不是
试试这个:在[…]
中,==
和=代码>操作符是一种模式匹配操作符,默认情况下启用扩展全局绑定
keep_pattern='*v[0-9][0-9]+([0-9]).txt'
for file in *; do
if [[ $file != $keep_pattern ]]; then
echo rm "$file"
fi
done
但是find
在这里更可取,如果可以进入子目录:
find . -regextype posix-extended '!' -regex '.*v[0-9]{3,}\.txt' -print
# ...............................^^^
如果返回您希望删除的文件,请将-print
更改为-delete
bash文件名扩展不使用正则表达式。看
要查找“v后跟3个或更多数字,后跟.txt”的文件,必须使用bash的扩展模式匹配。
示范:
$ shopt -s extglob
$ touch mari_v9009.txt femme_v9009.txt mari_v9010.txt femme_v9010.txt
$ touch foo_v12.txt
$ for f in *v[0-9][0-9]+([0-9]).txt; do echo "$f"; done
femme_v9009.txt
femme_v9010.txt
mari_v9009.txt
mari_v9010.txt
对于*v[0-9]{3,}*.txt中的i,这个模式的是:
首先,bash执行
for i in *v[0-9]3*.txt *v[0-9]*.txt
然后,第一个单词*v[0-9]3*.txt
将导致不匹配,bash的默认行为是将模式保留为普通字符串rm
尝试删除名为“*v[0-9]3*.txt”的文件,这会导致“文件未找到错误”
接下来,第二个单词*v[0-9]*.txt将展开,但展开将包括您不想删除的文件。
我错过了问题中的而不是
试试这个:在[…]
中,==
和=代码>操作符是一种模式匹配操作符,默认情况下启用扩展全局绑定
keep_pattern='*v[0-9][0-9]+([0-9]).txt'
for file in *; do
if [[ $file != $keep_pattern ]]; then
echo rm "$file"
fi
done
但是find
在这里更可取,如果可以进入子目录:
find . -regextype posix-extended '!' -regex '.*v[0-9]{3,}\.txt' -print
# ...............................^^^
如果返回您希望删除的文件,请将-print
更改为-delete
我有许多文件,如:mari_v9009.txt femme_v9009.txt mari_v9010.txt femme_v9010.txt…,因此我想删除包含子字符串的文件名=“9009”@locklockM似乎可以执行rm*v9009.txt
。使用手册页中所述的rm-f
,因为在这种情况下不会出现错误。我有许多文件,如:mari_v9009.txt femme_v9009.txt mari_v9010.txt femme_v9010.txt…,因此我想删除包含子字符串的文件名=“9009”@locklockM似乎可以只执行rm*v9009.txt
。使用手册页中所述的rm-f
,因为在这种情况下不会出现错误。不,它不起作用:((我仍然得到相同的结果)error@locklockM它到底是如何工作的?您得到了什么输出?我得到了相同的错误,*v[0-9]{3,}.txt rm:无法删除'*v[0-9]{3,}.txt”:没有这样的文件或目录shell globs中没有{m,n}
量化。不,它不起作用:((我仍然得到相同的error@locklockM它到底是如何工作的?您得到了什么输出?我得到了相同的错误,*v[0-9]{3,}.txt rm:无法删除“*v[0-9]{3,}.txt”:没有这样的文件或目录没有{m,n}
shell globs中的量化。*v[0-9]{3,}.txt rm:缺少操作数请尝试“rm--help”以获取更多信息。您有2>/dev/null
在其中?str=9009 patt=*v[0-9]{3,}.txt代表${patt}中的i;如果![[$i=~$str str i]],则回显“$i”;然后是rm$(eval ls$patt 2>/dev null | grep$str;fi done为什么要将其放入循环?*v[0-9]{3,}.txt rm:缺少操作数请尝试“rm--help”以获取详细信息。其中包含2>/dev/null
?str=9009 patt=*v[0-9]{3,}.txt,表示${patt};d中的i