`[$'\r\n']` 是什么意思?

Uni*_*ser 3 shell escape-characters

我经常使用这个表达line=${line//[$'\r\n']}。但是是什么[$'\r\n']意思呢?

我知道它删除了'\r\n'字符,但它是如何做到的?它是只删除两个字符的实例,还是只找到一个字符的匹配项?

我不明白这种语法的用法。

如果可以,请给我一个手册链接。我找不到这个问题的答案。

Mic*_*mer 8

此命令从line变量中删除所有回车和换行字节。

这是一击(和的zsh和ksh)扩展参数扩展:${line//XYZ}替换所有模式的比赛XYZ$line什么也没有。

该模式[$'\r\n']有两个组成部分:[...]匹配其中的任何字符$'\r\n'ANSI-C引述(另一个分机),并且扩展到回车(\r)和换行(\n)字节,因此[$'\r\n'][...]与在其内部一个回车和换行,所以匹配两者。

shell命令、运算符、括号等完整手册在这里,是 POSIX/SUS/IEEE 1003.1 规范的一部分。该猛砸参考手册是在这里

  • @jamesqf,**不,不是**。`${var/pattern/substitution}` 中的模式与用于通配文件名的模式相同,**不是**正则表达式。只是`[abc]` 在两者中的工作方式相同,但是尝试例如`var=abcd; echo ":${var//.*}:${var//*}:"`。参见例如 [this answer](https://unix.stackexchange.com/a/119906/170373)(其中还包括全局模式,而不仅仅是问题标题中提到的正则表达式) (4认同)

mur*_*uru 5

Bash 手册

$ {参数/模式/}
图案被膨胀,以产生一个模式,就像在文件名扩展。参数被扩展,并且模式 与其值的最长匹配被替换为字符串。匹配是根据下面描述的规则执行的(参见模式匹配)。如果 模式开头/,所有的比赛模式被替换为的字符串。... 如果string为空,则删除模式的匹配项,并且/可以省略以下模式。

你有${line//[$'\r\n']},其中:

  • 参数line
  • 图案/[$'\r\n'](注:开始/,所以图案的所有比赛被替换),和
  • 字符串是空的,所以/图案被省略,并且匹配被删除。

遵循模式匹配规则:

[…]
匹配任何一个封闭的字符。

$'...'告诉 bash 解释某些转义序列(这里,\r用于回车和\n换行)并将它们替换为由转义序列表示的实际字符。

因此,此替换匹配回车 (CR, \r) 或换行符 (LF, \n) 的所有实例,并删除它们。

  • 这个答案没有解释方括号内的`$'\r\n'` 是什么意思。幸运的是,下面的 [Michael Homer 的回答](https://unix.stackexchange.com/a/529938) 确实如此。 (3认同)