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

Regex 类Perl的速记字符类在括号表达式中不起作用,regex,macos,sed,Regex,Macos,Sed,\s似乎不适用于 sed 's/[\s]\+//' tempfile 当它为你工作的时候 sed 's/[ ]\+//' tempfile 由于以下命令,我试图删除每行开头的空白: nl -s ') ' file > tempfile e、 g.文件: 刀剑风暴,乔治·R·R·马丁,1216年 两座塔,J.R.R.托尔金,352年 炼金术士保罗·科埃略,197年 魔戒团契,J.R.R.托尔金,432 《朝圣》,保罗·科埃略,288年 《权力的游戏》,乔治·R·R·马丁,864年

\s
似乎不适用于

sed 's/[\s]\+//' tempfile
当它为你工作的时候

sed 's/[ ]\+//' tempfile
由于以下命令,我试图删除每行开头的空白:

nl -s ') ' file > tempfile  
e、 g.文件:

刀剑风暴,乔治·R·R·马丁,1216年
两座塔,J.R.R.托尔金,352年
炼金术士保罗·科埃略,197年
魔戒团契,J.R.R.托尔金,432
《朝圣》,保罗·科埃略,288年
《权力的游戏》,乔治·R·R·马丁,864年
临时文件:

1)剑之风暴,乔治·R·R·马丁,1216年
2) 双塔,J.R.R.托尔金,352
3) 炼金术大师保罗·科埃略,197年
4) 《魔戒之友》,J.R.R.托尔金,432年
5) 《朝圣》,保罗·科埃略,288年
6) 王位游戏,乔治·R·R·马丁,864
i、 数字前有空格


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

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

见:

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

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

考虑一下:

输出为abc<代码>\s子字符串已删除

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

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

注意:如果要确保删除行开头的空格,请在图案开头添加
^

sed 's/^[[:space:]]\+//'
       ^ 
更多图案

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

您也可以在没有固定宽度的情况下格式化数字。从
coreutils.info

“-w编号”
“--数字宽度=数字”
行号使用数字字符(默认为6)。
例如:

输出:

1)刀剑风暴,乔治·R·R·马丁,1216年
2) 两座塔,J.R.R.托尔金,352年
3) 炼金术士保罗·科埃略,197年
4) 魔戒团契,J.R.R.托尔金,432
5) 《朝圣》,保罗·科埃略,288年
6) 《权力的游戏》,乔治·R·R·马丁,864年

@Cyrus我确信您需要避开+符号,但为什么\s在列表中不起作用?这可能会有帮助:
sed-r的/[[:space:]+/'文件
@Cyrus我知道如何使它起作用。我想知道为什么这些东西有时不起作用。此外,我认为如果不转义+,代码将无法工作。另外,我不知道[:space:]请将一些文档链接到这些内容。我总是使用\s来表示空间,尽管我在Mac上,必须使用gnu,因为sed使用标准库中实现的正则表达式引擎,这取决于操作系统。有些根本不支持\s。括号中的和\s不适用于sed。使用
s/\s*/
或cyrus的建议。可能是因为
nl
的默认宽度是六个字符宽?试试sed的/^\s\s*/'文件。
sed 's/^[[:space:]]\+//'
       ^ 
nl -w 1 -s ') ' infile