括号表达式中的转义字符`\`

时间:2018-04-05 14:42:28

标签: bash grep

我读了一个摘自指令的例子,
并打算在\

中检查^[-[:alnum:]\._]+$
# is input a valid filename?
read -p "Enter a single item > "
if [[ "$REPLY" =~ ^[-[:alnum:]\._]+$ ]]; then
    echo "'$REPLY' is a valid filename."
else
    echo "The string '$REPLY' is not a valid filename."
fi

通过提供一些组合来检查括号表达式。

$ bash read_validate.sh
Enter a single item > test.tst.
'test.tst.' is a valid filename.'
#test `\`
$ bash read_validate.sh
Enter a single item > test\\tst
The string 'test\tst' is not a valid filename.

当我从\移除转义^[-[:alnum:]\._]+$时,转为^[-[:alnum:]._]+$

$ bash read_validate.sh
Enter a single item > test.tst
'test.tst' is a valid filename.
# to assert that dot is not the any character sign.
$ bash read_validate.sh
Enter a single item > test*tst
The string 'test*tst' is not a valid filename.
# codes run properly.

似乎没有必要将escape \插入模式。

是吗?
我无法确定是否省略了关于括号表达式和转义字符的一些关键点?

1 个答案:

答案 0 :(得分:2)

Bash使用Extended Regular Expressions。引用标准:

  

特殊字符'。',' *',' ['和' \' (句点,星号,左括号和反斜杠)将在括号表达式中失去其特殊含义。

因此,在[ ]内,他们不需要被转义。

由于Bash处理字符串中的反斜杠,因此情况稍微复杂一些:

$ set -x
$ [[ '\' =~ [\.] ]] && echo yes
+ [[ \ =~ [.] ]]                # look, no backslash!

因此,使用正则表达式的推荐方法是设置shell变量:

$ re='[\.]'
+ re='[\.]'
$ [[ '\' =~ $re ]] && echo yes
+ [[ \ =~ [\.] ]]               # backslash preserved!
+ echo yes
yes