Mar*_*cus 5 regex bash internals
在Linux 文档项目中(我没有在Bash 手册中找到有关正则表达式元字符的详细信息),元字符^和$被定义为匹配行:
^: 匹配行首的空字符串 [...]
$: 匹配行尾的空字符串
但是,当我尝试时,这是不正确的:
$ string="a
> b
> c"
$ [[ $string =~ ^a ]] && echo BOS match
BOS match
$ [[ $string =~ ^b ]] && echo BOL match
# nothing
Run Code Online (Sandbox Code Playgroud)
手册真的错了,还是我遗漏了一些东西?
^匹配 POSIX 正则表达式中整个输入字符串的开头和$整个输入字符串的结尾(Bash 使用 POSIX ERE)。您链接到的文档提到了行,因为大多数文本处理工具(例如 )sed默认情况下grep会awk逐行读取输入,并且在大多数情况下字符串与该行一致。
请参阅POSIX 正则表达式文档:
9.3.8 BRE 表达式锚定
BRE 可以限制为匹配行开头或结尾的字符串;这称为“锚定”。在以下情况下,扬抑符和美元符号特殊字符应被视为 BRE 锚点:
当用作整个 BRE 的第一个字符时,扬抑符 (
'^') 应为锚点。当用作子表达式的第一个字符时,实现可以将扬抑符视为锚点。抑扬符应将表达式(或可选的子表达式)锚定到字符串的开头;BRE只能匹配从字符串第一个字符开始的序列。例如,BRE“^ab”匹配字符串“abcdef”中的“ab”,但无法匹配字符串“cdefab”。BRE“(^ab)”可能与前一个字符串匹配。可移植的 BRE 应转义子表达式中的前导抑扬符以匹配字面抑扬符。当美元符号 (
'$') 用作整个 BRE 的最后一个字符时,应作为锚点。当用作子表达式的最后一个字符时,实现可以将美元符号视为锚点。美元符号应将表达式(或可选的子表达式)锚定到匹配字符串的末尾;美元符号可以说与最后一个字符后面的字符串结尾匹配。由两者锚定的 BRE
'^'只能'$'匹配整个字符串。例如,BRE"^abcdef$"匹配仅包含"abcdef".
| 归档时间: |
|
| 查看次数: |
1647 次 |
| 最近记录: |