bash中[[:space:]]的含义是什么?


23

我刚遇到一个bash脚本。[[:space:]]bash脚本是什么意思?为什么是双冒号?

Answers:


35

确实,这是bash手册中的内容,但有助于了解您要查找的内容,如果您不知道要查找的内容,无济于事。如果您进行搜索,[[则会被[[ expression ]]条件表达式部分分心。此外,在:space:同一部分的两个示例中搜索您的土地。您可以在该示例中遵循面包屑:

例如,如果值中包含一系列字符(包括零个空格字符,零个或一个“ a”实例)组成一个字符序列,则以下内容将匹配一行(存储在shell变量行中) 'b':

[[ $line =~ [[:space:]]*?(a)b ]]

...,您可以从中拼凑出该[[:space:]]部分对应于“空格字符”,但是您可以认为它只是一个文字空格字符,而不是它所代表的整个字符类别,因此可以原谅。

如果您(正巧?)" space"在线bash手册中搜索字符串(即空格,后跟单词“ space”),则大约只有32个匹配项需要经过。大约第十个会在这里:

在'['和']'中,可以使用语法[:class:]指定字符类,其中class是POSIX标准中定义的以下类之一:

alnum   alpha   ascii   blank   cntrl   digit   graph   lower
print   punct   space   upper   word    xdigit

字符类别与属于该类别的任何字符匹配。

然后将带您进入POSIX标准,您可以在其中搜索术语“字符类”并找到

wctype,wctype_l-定义字符类,它可以使您达到:

wctype()[CX] [Option Start]和wctype_l()[Option End]函数应根据当前语言环境[CX] [Option Start]中由字符类型信息定义的编码字符集的规则来确定wctype_t的值。或在由语言环境表示的语言环境中,分别为[Option End](类别LC_CTYPE)。

然后,如果您使用setlocale链接,那么您最终会在Locale部分中找到真正的答案:

空间

定义要归类为空格字符的字符。在POSIX语言环境中,<space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>应完全包括在内。

在语言环境定义文件中,不得为关键字upper,lower,alpha,digit,graph或xdigit指定任何字符。该<space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>便携式字符集,并包含在类空白的任何字符的自动包含在这个类。


1
更容易找到手动匹配,LESS=+'/Within \[ and \],' man bash而不是32个next命令:-)。
以撒

5
@Isaac我认为关键是要教那个人如何钓鱼。就是说,我不知道less +"$cmd",所以谢谢。
JoL

3
确实,我是根据《任择议定书》的观点回答的。他们可以原谅他们不承认外部[]独立于内部[]。我尝试了(!)来找到从问题到答案的方法,但并不太了解答案是什么,尽管这需要进行一些幸运的猜测:)
杰夫·谢勒

17

它不仅适用于Bash,而且是POSIX表示法的一部分。

什么是POSIX?

POSIX或“ uniX的便携式操作系统接口”是一组标准,这些标准定义了(UNIX)操作系统应支持的某些功能。这些标准之一定义了两种正则表达式。

POSIX括号表达式

POSIX方括号表达式是一种特殊的字符类。POSIX中括号表达式匹配一组字符中的一个字符,就像常规字符类一样。

标准POSIX

[[:alnum:]]   Alphanumeric characters
[[:alpha:]]   Alphabetic characters
[[:blank:]]   Space and tab
[[:cntrl:]]   Control characters
[[:digit:]]   Digits
[[:graph:]]   Visible characters (anything except spaces and control characters)
[[:lower:]]   Lowercase letters
[[:print:]]   Visible characters and spaces (anything except control characters)
[[:punct:]]   Punctuation (and symbols).
[[:space:]]   All whitespace characters, including line breaks
[[:upper:]]   Uppercase letters
[[:xdigit:]]  Hexadecimal digits

无标准

[[:ascii:]]   ASCII characters
[[:word:]]    Word characters (letters, numbers and underscores)

旧式语法(有人可以找到对这些语法的引用吗?)

[[:<:]]       Start of Word 
[[:>:]]       End of Word

您可以在此处找到更多信息:Wiki


1
[[:ascii:]],而[[:word:]]不是POSIX类(他们似乎是bash特异的),我找不到[[:<:]]也没有[[:>:]]任何。更好的参考可能已经pubs.opengroup.org/onlinepubs/9699919799/basedefs/...
Kusalananda

1
是的,[[:ascii:]][[:word:]]都不是标准的POSIX类。对于[[:<:]][[:>:]],我找不到任何引用,但是与相同\bzh.wikipedia.org/wiki/Regular_expression#Character_classes
尼玛

Postgres定义的使用[[:<:]]并声称:这是一个扩展,与POSIX 1003.2兼容但未指定
Isaac

[[:<:]]在FreeBSD下也有同样的警告为PostgreSQL有:freebsd.org/cgi/...
ilkkachu

1
[[:ascii:]][[:word:]]模式匹配Bash中当然的工作,而不是在正则表达式(至少在我的系统,我觉得Bash使用系统的正则表达式库)。呸。
ilkkachu

9

在正则表达式和文件名glob / shell模式中,该[...]结构与括号内列出的任何一个字符匹配。在这些括号内,可以使用许多命名的标准字符字符类。其中之一是[:space:],它与空白字符匹配(例如\s在Perl正则表达式中)。参见例如Bash手册中的模式匹配

因此,[[:space:]]是正则表达式或模式匹配的一部分,仅与空白匹配。

例如模式匹配(标准外壳,不是Bash专用):

case $var in 
    *[[:space:]]*) echo "'$var' contains whitespace";;
esac

或正则表达式(重击):

if [[ $var =~ [[:space:]] ]]; then
    echo "'$var' contains whitespace"
fi

请注意,即使支架表达式[...]的工作方式相同的正则表达式和外壳的图案,他们一般都非常一样的。(case[[ string == pattern ]]使用模式匹配,[[ string =~ regex ]]使用正则表达式。)

正则表达式还没有shell特定的,他们在如习惯awksed过了,在例如描述Linux手册页regex(7)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.