如何将bash转换为sh

如何将bash转换为sh,bash,expression,sh,Bash,Expression,Sh,我想使用正则表达式,它在bash中工作,但在sh中工作 str=9009 for i in *v[0-9][0-9][0-9][0-9].txt; do echo "$i"; if ! [[ "$i" =~ $str ]]; then rm "$i" ; fi done 文件名如下:mari_v9009.txt femme_v9009.txt mari_v9010.txt femme_v9010.txt,mari.txt,femme.txt 因此,我想删除这些文

我想使用正则表达式,它在bash中工作,但在sh中工作

str=9009
for i in *v[0-9][0-9][0-9][0-9].txt; do echo "$i";      
       if ! [[ "$i" =~ $str ]]; then rm "$i" ; fi    done
文件名如下:mari_v9009.txt femme_v9009.txt mari_v9010.txt femme_v9010.txt,mari.txt,femme.txt


因此,我想删除这些文件:mari_v9010.txt femme_v9010.txt

case $i in
    *"$str"* ) # do nothing
        ;;
    * ) rm "$i"
        ;;
esac
从您的评论中,听起来您实际上是在寻求帮助,而不仅仅是
if
语句中的regexp。试试这个:

str=9009
for i in ./*v[0-9][0-9][0-9][0-9].txt; do
    echo "$i" >&2
    if [ -e "$i" ]; then
        case $i in
            *"$str"* )
                echo "match for $str in $i" > &2
                ;;
            * ) echo "no match for $str in $i" >&2
                ;;
        esac
    else
         echo "no file name matching $i in directory" >&2
    fi
done
并在测试后将
echo
s更改为您喜欢的任何内容

也可以考虑不做上述任何事情,而是这样做:

find . -maxdepth 1 -name '*v[0-9][0-9][0-9][0-9].txt' ! -name "*$str*" -exec echo rm {} \;

这可能是您正在寻找的:

case $i in
    *"$str"* ) # do nothing
        ;;
    * ) rm "$i"
        ;;
esac
从您的评论中,听起来您实际上是在寻求帮助,而不仅仅是
if
语句中的regexp。试试这个:

str=9009
for i in ./*v[0-9][0-9][0-9][0-9].txt; do
    echo "$i" >&2
    if [ -e "$i" ]; then
        case $i in
            *"$str"* )
                echo "match for $str in $i" > &2
                ;;
            * ) echo "no match for $str in $i" >&2
                ;;
        esac
    else
         echo "no file name matching $i in directory" >&2
    fi
done
并在测试后将
echo
s更改为您喜欢的任何内容

也可以考虑不做上述任何事情,而是这样做:

find . -maxdepth 1 -name '*v[0-9][0-9][0-9][0-9].txt' ! -name "*$str*" -exec echo rm {} \;

不,因为它会删除其他文件,比如mari.txt,所以我不想要它,我想删除包含*v[0-9][0-9]+([0-9]).txt的文件,并匹配一个像9009nope这样的数字,因为它会删除这些文件mari.txt,femme.txt,所以我不会删除这些文件。我不知道你是从哪里来的。循环中的全局搜索只会选择与全局搜索模式匹配的文件
*v[0-9][0-9]+([0-9]).txt
。或者这也不是你想要的?您只询问了一个regexp,这就是我试图帮助您的地方,
if
中的regexp不是
for
中的globbing模式。如何使用您的代码,我得到rm:无法删除“”:没有这样的文件或目录没有相当于
+([0-9])
的sh。这个case语句完美地替换了这个特定的正则表达式match thoughnope,因为它会删除其他文件,比如mari.txt,所以我不想要它,我想删除包含*v[0-9][0-9]+([0-9]).txt的文件,并匹配一个像9009nope这样的数字,因为它会删除这些文件mari.txt,femme.txt,所以我不会说它不会删除那些文件。我不知道你是从哪里来的。循环中的全局搜索只会选择与全局搜索模式匹配的文件
*v[0-9][0-9]+([0-9]).txt
。或者这也不是你想要的?您只询问了一个regexp,这就是我试图帮助您的地方,
if
中的regexp不是
for
中的globbing模式。如何使用您的代码,我得到rm:无法删除“”:没有这样的文件或目录没有相当于
+([0-9])
的sh。这个case语句完美地替换了这个特定的正则表达式匹配