shell 脚本奇数正则表达式
shell script odd regex
我有一些正则表达式在我的 shell 脚本中表现得很奇怪我有变量,我已经尝试了各种方法让它们表现出来,但它们似乎不做任何正则表达式,我知道多亏了 regex101,我的正则表达式非常好,下面是一个示例
fname="direcheck"
FIND="*"
if [[ $fname =~ $FIND ]]; then
echo "no quotes"
fi
if [[ "$fname" =~ "$FIND" ]]; then
echo "with quotes"
fi
现在什么都不显示
如果我将 find 更改为
FIND="[9]*"
然后它不打印引号
如果我说
FIND="[a-z]*"
然后它不打印引号
如果我说
FIND="dircheck"
然后什么都不打印
如果我说
FIND="*ck"
然后什么都不打印
我不明白这个正则表达式是如何工作的
我如何使用这些变量,正确的语法是什么?
*
和 *ck
是无效的正则表达式。如果您与 ==
而不是 =~
进行比较,它会起作用(没有引号)。如果您想为它们使用在 ==
中获得的相同功能,则等效的正则表达式是 .*
和 .*ck
.
[9]*
是 9
的任意数量(包括零)字符。您的 direcheck
中有零个字符 9
,因此匹配。 (由 brainfart 编辑,感谢 chepner)
dircheck
未在 direcheck
中找到,因此不打印任何内容不足为奇。
[a-z]*
是介于 a
和 z
之间的任意数量的字符(即任意数量的小写字母)。这将匹配,假设它没有被引用。
我终于弄明白了,为什么它工作起来这么奇怪
[a-z]* 和 [9]* 以及 [anythinghere]* 它们都匹配,因为它匹配零次或多次。所以 "direcheck" 有 [9] 零次或多次。
所以
if [[ "$fname" =~ $FIND ]]; then
或
if [[ $fname =~ $FIND ]]; then
都正确,
if [[ "$fname" =~ "$FIND" ]]; then
仅在字符串完全匹配时才匹配,因为 $FIND
作为文字字符串而不是正则表达式匹配
我有一些正则表达式在我的 shell 脚本中表现得很奇怪我有变量,我已经尝试了各种方法让它们表现出来,但它们似乎不做任何正则表达式,我知道多亏了 regex101,我的正则表达式非常好,下面是一个示例
fname="direcheck"
FIND="*"
if [[ $fname =~ $FIND ]]; then
echo "no quotes"
fi
if [[ "$fname" =~ "$FIND" ]]; then
echo "with quotes"
fi
现在什么都不显示 如果我将 find 更改为
FIND="[9]*"
然后它不打印引号 如果我说
FIND="[a-z]*"
然后它不打印引号
如果我说
FIND="dircheck"
然后什么都不打印
如果我说
FIND="*ck"
然后什么都不打印
我不明白这个正则表达式是如何工作的
我如何使用这些变量,正确的语法是什么?
*
和*ck
是无效的正则表达式。如果您与==
而不是=~
进行比较,它会起作用(没有引号)。如果您想为它们使用在==
中获得的相同功能,则等效的正则表达式是.*
和.*ck
.[9]*
是9
的任意数量(包括零)字符。您的direcheck
中有零个字符9
,因此匹配。 (由 brainfart 编辑,感谢 chepner)dircheck
未在direcheck
中找到,因此不打印任何内容不足为奇。[a-z]*
是介于a
和z
之间的任意数量的字符(即任意数量的小写字母)。这将匹配,假设它没有被引用。
我终于弄明白了,为什么它工作起来这么奇怪
[a-z]* 和 [9]* 以及 [anythinghere]* 它们都匹配,因为它匹配零次或多次。所以 "direcheck" 有 [9] 零次或多次。
所以
if [[ "$fname" =~ $FIND ]]; then
或
if [[ $fname =~ $FIND ]]; then
都正确,
if [[ "$fname" =~ "$FIND" ]]; then
仅在字符串完全匹配时才匹配,因为 $FIND
作为文字字符串而不是正则表达式匹配