我有一个名为 bash 变量flentry
,它由以下部分组成:
File: Value
或者
+ Value
用过的
fld="${flentry%[[:blank:]]*}"
和
fl="${flentry#*[[:blank:]]}"
获取字段名称File:
和+
,而fl
获取值。
看起来好像 bash 参数扩展使用了正则表达式模式,或者我错了?
我理解%
删除最短尾随匹配,同时#
删除最小尾随匹配。但我不明白如何fld
分别fl
获取字段名称和字段值。
答案1
形式${parameter#word}
、${parameter%word}
和${parameter##word}
是${parameter%%word}
POSIX 规范的一部分参数扩展在所有情况下,word
都被视为与文件名生成(“glob”)表达式相同,如模式匹配符号。虽然这些模式与正则表达式有一些表面上的相似之处,但它们不是正则表达式-参见示例正则表达式与用于过滤文件的通配符有何不同。
bash shell 通过多种方式扩展了该规范;例如
bash 允许使用 regex-style
[^...]
作为 POSIX 的替代方案[!...]
来反转字符集(当
extglob
启用 shell 选项时)bash 支持 ksh 样式的扩展 glob,类似+(foo|bar)
正则表达式的交替和量词功能。
有关完整详细信息,请参阅 bash 手册中的模式匹配。
因此,fld="${flentry%[[:blank:]]*}"
扩展变量flentry
,从其末尾删除与空白(空格或制表符)字符匹配的最短子字符串,后面跟着零个或多个其他字符(即最后的空格或制表符添加到字符串末尾)。 如果flentry
包含字符串File: Value
,则结果为File:
。
类似地,fl="${flentry#*[[:blank:]]}"
扩展flentry
,从其开头删除与零个或多个字符匹配的最短子字符串,后跟一个空格或制表符(即从字符串开头到包括第一的空格或制表符),结果为Value
。
请注意,如果字段名称和值之一或两者均包含空格,则这种分隔字段名称和值的方法将失败。看来您确实应该使用:[[:blank:]]
作为分隔符。