bash 中的 [[:space:]] 是什么意思?

bash 中的 [[:space:]] 是什么意思?

我刚刚遇到一个 bash 脚本。[[:space:]]bash 脚本中的含义是什么?为什么是双冒号?

答案1

它确实在 bash 手册中,但它有助于了解您在寻找什么,哪个不是如果您不知道自己在看什么,这会很有帮助。如果您进行搜索,[[您会被[[ expression ]]条件表达式部分分散注意力。此外,搜索:space:会使您看到同一部分下的两个示例。您可以按照该示例中的面包屑导航:

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

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

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

如果您(碰巧?)" space"在线 bash 手册,“只有”大约 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 的值或分别在 locale、[Option End] 表示的语言环境中(类别 LC_CTYPE)。

如果您随后遵循设置语言环境链接,你最终会得到真正的答案,在区域设置部分:

空间

定义要分类为空白字符的字符。在 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>的 ,以及类空白中包含的任何字符都会自动包含在此类中。

答案2

它不仅适用于 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

您可以在这里找到更多信息:维基百科

答案3

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

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

例如,模式匹配(标准 shell,不是 Bash 特定的):

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

或正则表达式(Bash):

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

请注意,尽管方括号表达式[...]在正则表达式和 shell 模式中的工作方式相同,但它们通常非常相似。不是相同。 (case[[ string == pattern ]]使用模式匹配,[[ string =~ regex ]]使用正则表达式。)

正则表达式也不是特定于 shell 的,它们也用在egawk和中sed,并且在eg 中进行了描述Linux 手册页regex(7)

相关内容