regex 在bash中识别文件名中的无效字符[重复]

ny6fqffe  于 2023-10-22  发布在  其他
关注(0)|答案(2)|浏览(101)

此问题已在此处有答案

How do you escape a hyphen as character range in a POSIX regex(2个答案)
上个月关门了。
我正在尝试识别用户提供的文件名是否包含无效字符。我添加了这一部分:

filename=$(basename "$sourceFilePath")

if [[ ! $filename =~ ^[a-zA-Z0-9_\-\.]+$ ]]; then
   echo "Invalid characters in filename: $filename Please provide a valid filename."
   exit 0
fi

不幸的是,当文件名有效时,它会进入查询。举例来说:

if [[ ! test.txt =~ ^[a-zA-Z0-9_\-\.]+$ ]]; then echo "Invalid characters in filename: Please provide a valid filename."; fi
Invalid characters in filename:  Please provide a valid filename.

if [[ ! "test.txt" =~ ^[a-zA-Z0-9_\-\.]+$ ]]; then echo "Invalid characters in filename: Please provide a valid filename."; fi
Invalid characters in filename:  Please provide a valid filename.

我做错了什么?
谢谢

vhmi4jdf

vhmi4jdf1#

反斜杠在bash正则表达式中不以这种方式工作。点不需要,但破折号需要移动到组的开头或结尾。

if [[ ! $filename =~ ^[a-zA-Z0-9_.-]+$ ]]; then

还要注意,这个正则表达式接受像...这样的名称,这可能会导致问题。

gxwragnw

gxwragnw2#

您没有指定“无效”的标准,但从您的尝试中,我假设您想要验证文件名仅由字母,数字,下划线字符,破折号和句号组成。
对于这样一个简单的测试,使用正则表达式是多余的。如果你颠倒测试的逻辑,你可以通过globbing来实现:

if [[ $filename == *[^-_.[:alnum:]]* ]]
then
  echo The name $filename contains an invalid character
else
  echo The name $filename is valid
fi

这里的技巧不仅是否定有效字符的范围,而且还将-放在有效字符列表的开始,这样它就不会被理解为字符范围指示符。
根据您的需求,您也可以使用a-zA-Z0-9来代替字符类[:alnum:]

相关问题