Answers:
的~
实际上是操作者的一部分=~
,其执行将字符串其左侧到其右边的扩展正则表达式的正则表达式匹配。
[[ "string" =~ pattern ]]
请注意,字符串应加引号,而正则表达式不应加引号。
Perl编程语言中使用了类似的运算符。
所理解的正则表达式bash
与GNU grep
带有-E
标志所理解的正则表达式相同,即正则表达式的扩展集。
有点题外话,但要知道:
当与包含捕获组的正则表达式匹配时,每个组捕获的字符串部分在BASH_REMATCH
数组中可用。在该阵列对应第零/第一个条目&
中的替换模式sed
的替换命令(或$&
在Perl),这是与该模式匹配的串的位,而在索引1中的条目和起对应于\1
,\2
等。在一个sed
替换模式(或者$1
,$2
等在Perl),即由每个括号匹配的位。
例:
string=$( date +%T )
if [[ "$string" =~ ^([0-9][0-9]):([0-9][0-9]):([0-9][0-9])$ ]]; then
printf 'Got %s, %s and %s\n' \
"${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
fi
这可能输出
Got 09, 19 and 14
如果当前时间恰好是09:19:14。
数组名称的REMATCH
位BASH_REMATCH
来自“正则表达式匹配”,即“ RE-Match”。
在非bash
Bourne类shell中,也可以使用expr
有限的正则表达式匹配(仅使用基本正则表达式)。
一个小例子:
$ string="hello 123 world"
$ expr "$string" : ".*[^0-9]\([0-9][0-9]*\)"
123
grep -E
仅在GNU系统上以及仅在使用未引用的变量作为模式时才了解的内容相同[[ $var = $pattern ]]
(请参阅[[ 'a b' =~ a\sb ]]
vs p='a\sb'; [[ 'a b' =~ $p ]]
)。还请注意,shell引号会影响RE运算符的含义,并且shell标记化中需要引用一些字符,这可能会影响RE处理。[[ '\' =~ [\/] ]]
返回false。ksh93
还有更糟糕的问题。请参阅zsh
(或bash 3.1)以获取更明智的方法,其中将shell引用和RE引用明确分开。的[
的内置zsh
和yash
也有=~
运营商。
off-topic
!+1(
[[ "This is a fine mess." =~ T.........fin*es* ]]; [[ "This is a fine mess." =~ T.........fin\*es\* ]]
。还是那个引用*
也匹配?[[ "This is a fine mess." =~ "T.........fin*es*" ]]
。
[[ a =~ .* ]]
或[[ a =~ '.*' ]]
或中[[ a =~ \.\* ]]
,相同的.*
RE传递给=~
运算符。OTH中的bash
,[[ '\' =~ [)] ]]
返回错误,是否尝试不[[ '\' =~ [\)] ]]
匹配是否会知道?怎么样[[ '\' =~ [\/] ]]
(它在ksh93中执行)。怎么样c='a-z'; [[ a =~ ["$c"] ]]
(与=
运营商比较)?另请参见:[[ '\' =~ [^]"."] ]]
返回错误......请注意,你可以做shopt -s compat31
在bash
拿到zsh
行为。
zsh
/ bash -o compat31
的行为[[ a =~ '.*' ]]
也与[ a '=~' '.*' ]
(对于[
支持的实现=~
)或一致expr a : '.*'
。OTOH,它与[[ a = '*' ]]
vs 不一致[[ a = * ]]
(但是,glob是shell语言的一部分,而RE则不是)。
您应该阅读本[[ expression ]]
节下的bash手册页。
An additional binary operator, =~, is available, with the same precedence as == and !=. When it is used, the string to the right of the operator is considered an extended regular expression and matched accordingly (as in regex(3)).
长话短说,=~
是运算符,就像==
和一样!=
。它与右侧字符串中的实际正则表达式无关。
=~
在现实生活中的用法吗?
man [[ expresssion ]]
,man [[
什么也不返回。 help [[
由于[[
内部bash命令而返回有用的信息,但是没有说明是=~
使用基本的还是扩展的正则表达式语法。you您引用的文本来自bash手册页。我意识到您说过“阅读bash手册页”,但起初,我以为您的意思是阅读bash中的手册页。无论如何,都man bash
将返回一个巨大的文件,该文件长4139行(72页)。可以通过按进行搜索/▒▒▒
,该键接受一个正则表达式,=~
未指定其味道(例如)。