我经常使用这个表达方式line=${line//[$'\r\n']}
。但这是什么[$'\r\n']
意思呢?
我知道它可以删除'\r\n'
字符,但它是如何做到的?它是只删除两个字符的实例,还是还会找到仅一个字符的匹配项?
我不明白这个语法的用法。
如果可以的话,请给我一个手册的链接。我找不到这个问题的答案。
答案1
此命令从变量中删除所有回车符和换行符字节line
。
这是参数扩展的 Bash(以及 zsh 和 ksh)扩展:${line//XYZ}
替换全部模式XYZ
与$line
任何内容都匹配。
该模式[$'\r\n']
有两个组成部分:[...]
火柴任何里面的字符。$'\r\n'
是ANSI-C 引用(另一个扩展),并扩展为回车符 ( \r
) 和换行符 ( \n
) 字节,其中[$'\r\n']
包含[...]
回车符和换行符,因此与它们都匹配。
这的完整手册壳命令、运算符、括号等都在这里,POSIX/SUS/IEEE 1003.1 规范的一部分。这重击参考手册在这里。
答案2
从Bash 手册:
${范围/图案/细绳}
这图案被扩展以产生一个模式,就像文件名扩展一样。范围被扩展并且最长的匹配图案 其值被替换为字符串。比赛按照下述规则进行(参见模式匹配)。如果 图案开始于/
, 的所有匹配项图案被替换为细绳。 ... 如果细绳为空,匹配图案被删除并且/
以下模式可以被省略。
你有${line//[$'\r\n']}
,其中:
- 这范围是
line
, - 这图案是
/[$'\r\n']
(注意:以 开头/
,因此模式的所有匹配项都会被替换),并且 - 这细绳为空,所以
/
之后图案被省略,并且匹配被删除。
遵循以下规则模式匹配:
[…]
匹配任何一个包含的字符。
$'...'
告诉 bash 解释某些转义序列(这里是\r
回车符和\n
换行符)并将它们替换为转义序列表示的实际字符。
因此,此替换匹配回车符 (CR, \r
) 或换行符 (LF, \n
) 的所有实例,并删除它们。
答案3
$ 表示:查看模式的行尾 模式为 '\r\n';含义:\r(回车符)\n(换行符)
方括号 [ ] 用于将在单独的行上搜索的内容括起来