为什么我不需要转义 sed 中的字符类,但我需要转义其余部分?

Jim*_*Jim 2 linux sed regular-expression

我对 sed 感到困惑。
我有一个包含以下内容的文件:

[ 2014/02/10 14:45:15 | INFO   ] Saving data for customer: 273667  
[ 2014/02/10 14:45:15 | INFO   ] Saving data for customer: 273687  
[ 2014/02/10 14:45:15 | INFO   ] Saving data for customer: 272667  
[ 2014/02/10 14:45:15 | INFO   ] Saving data for customer: 373667  
[ 2014/02/10 14:45:15 | INFO   ] Saving data for customer: 573667  
[ 2014/02/10 14:45:15 | INFO   ] Saving data for customer: 263667  
Run Code Online (Sandbox Code Playgroud)

我想删除除客户 ID 之外的所有内容。所以我运行以下命令:

$ sed 's/^.*:\s\(\[0-9\]\{6\}\)/\1/g' customers.txt > customers2.txt  
Run Code Online (Sandbox Code Playgroud)

这绝对没有任何作用。
在考虑之后(以及很多挫折)我试图从[]. 所以我运行以下命令:

$ sed 's/^.*:\s\([0-9]\{6\}\)/\1/g' customers.txt > customers2.txt    
Run Code Online (Sandbox Code Playgroud)

这奏效了。
但现在我无法真正理解 sed 的工作原理。为什么我需要转义(分组和{范围而不是[字符类?

ter*_*don 5

基本上,因为[ ]是基本正则表达式语法的一部分,而捕获组{}则不是。转义[]意味着您要匹配文字括号,而不是类。

顺便说一句,如果您想要打印文件中的最后一个字段,awk则要容易得多:

awk '{print $NF}' customers.txt > customers2.txt    
Run Code Online (Sandbox Code Playgroud)

在您的特定情况下,您还可以使用cut

cut -d':' -f 4 customers.txt > customers2.txt    
Run Code Online (Sandbox Code Playgroud)

你可以随时使用 Perl:

perl -pe 's/.*:\s*//' customers.txt 
Run Code Online (Sandbox Code Playgroud)