类似 Perl 的速记字符类在括号表达式内不起作用

3 regex macos sed

\s似乎不适合

sed 's/[\s]\+//' tempfile
Run Code Online (Sandbox Code Playgroud)

当它正在为

sed 's/[ ]\+//' tempfile
Run Code Online (Sandbox Code Playgroud)

我正在尝试删除由于以下命令而出现在每行开头的空格:

nl -s ') ' file > tempfile  
Run Code Online (Sandbox Code Playgroud)

例如文件:

sed 's/[\s]\+//' tempfile
Run Code Online (Sandbox Code Playgroud)

临时文件:

sed 's/[ ]\+//' tempfile
Run Code Online (Sandbox Code Playgroud)

即数字前面有空格

请解释为什么会出现空白以及\s不起作用的原因。

Wik*_*żew 6

原因很简单:POSIX 正则表达式引擎不会解析括号表达式内的类似 Perl 的简写字符类。

请参阅此参考

一个关键的语法差异是反斜杠不是 POSIX 括号表达式中的元字符。所以在 POSIX 中,正则表达式[\d]匹配 a\或 a d

因此, [\s]在 POSIX 正则表达式中,匹配两个符号之一:\s

考虑以下演示

echo 'ab\sc' | sed 's/[\s]\+//'
Run Code Online (Sandbox Code Playgroud)

输出是abc. \s子字符串被删除。

考虑使用 POSIX 字符类而不是类似 Perl 的简写:

echo 'ab\s c' | sed 's/[[:space:]]\+//'
Run Code Online (Sandbox Code Playgroud)

请参阅此在线演示(输出为ab\sc)。POSIX 字符类由 组成[:<NAME_OF_CLASS>:],并且它们只能在括号表达式内使用。请在此处查看POSIX 字符类的更多示例

注意:如果您想确保删除行开头的空格,请^在模式开头添加:

sed 's/^[[:space:]]\+//'
       ^ 
Run Code Online (Sandbox Code Playgroud)

更多图案

  • \w=[[:alnum:]_]
  • \W=[^[:alnum:]_]
  • \d= [[:digit:]](或[0-9]
  • \D= [^[:digit:]](或[^0-9]
  • \h=[[:blank:]]
  • \S=[^[:space:]]