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

时间:2017-09-03 06:37:59

标签: regex macos sed

\s似乎无法与

一起使用
sed 's/[\s]\+//' tempfile

正在为

工作
sed 's/[ ]\+//' tempfile

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

nl -s ') ' file > tempfile  

e.g。文件:

A Storm of Swords, George R. R. Martin, 1216
The Two Towers, J. R. R. Tolkien, 352
The Alchemist, Paulo Coelho, 197
The Fellowship of the Ring, J. R. R. Tolkien, 432
The Pilgrimage, Paulo Coelho, 288
A Game of Thrones, George R. R. Martin, 864

临时文件:

 1) Storm of Sword, George R. R. Martin, 1216
 2) The Two Tower, J. R. R. Tolkien, 352
 3) The Alchemit, Paulo Coelho, 197
 4) The Fellowhip of the Ring, J. R. R. Tolkien, 432
 5) The Pilgrimage, Paulo Coelho, 288
 6) A Game of Throne, George R. R. Martin, 864

即。数字之前有空格

请解释为什么会出现空格以及\s无效的原因。

2 个答案:

答案 0 :(得分:2)

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

请参阅this reference

  

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

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

考虑following demo

echo 'ab\sc' | sed 's/[\s]\+//'

输出为abc。 <{1}}子字符串已删除。

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

\s

请参阅this online demo(输出为echo 'ab\s c' | sed 's/[[:space:]]\+//' )。 POSIX字符类由ab\sc组成,它们只能在括号表达式中使用。请参阅more examples of POSIX character classes here

注意:如果您想确保删除该行开头的空格,请在模式开头添加[:<NAME_OF_CLASS>:]

^

更多图案

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

答案 1 :(得分:1)

您也可以格式化没有固定宽度的数字。来自coreutils.info

‘-w NUMBER’
‘--number-width=NUMBER’
     Use NUMBER characters for line numbers (default 6).

E.g:

nl -w 1 -s ') ' infile

输出:

1) A Storm of Swords, George R. R. Martin, 1216
2) The Two Towers, J. R. R. Tolkien, 352
3) The Alchemist, Paulo Coelho, 197
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
5) The Pilgrimage, Paulo Coelho, 288
6) A Game of Thrones, George R. R. Martin, 864