Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex bash比较正则表达式而不是变量_Regex_Bash_Loops - Fatal编程技术网

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