2012-09-07 47 views
2

这个bash脚本应该从grep的搜索结果中删除前导空白:这个sed命令为什么不匹配空格?

#!/bin/bash 
grep --color=always [email protected] | sed -r -e's/:[[:space:]]*/:/' 

但它不匹配的空白。如果我将替换文本更改为“ - ”,它将显示在输出中,但仍不会删除空格。我已经尝试了没有“*”,用“+”等转义“*”,但没有任何作用。有谁知道为什么不呢?

(我使用SED 4.2.1版本在Ubuntu 12.04。)


感谢所有,这是我修改后的脚本,它显示grep的颜色,也修剪前导空格:

#!/bin/bash 
grep --color=always [email protected] | sed -r -e's/[[:space:]]+//' 

回答

6

您需要删除--color选项才能使其工作。颜色代码混淆SED:

grep [email protected] | sed -r -e's/:[[:space:]]*/:/' 
+0

+1 - 真棒。删除我的答案。每天学些新东西。 – Buggabill

+0

他们为什么混淆sed? –

+0

@MichaelFoukarakis因为在'grep --color'的输出中实际上没有':[[:space:]]' - 而是有一堆'\ 033 ['转义序列(可能因终端而异)在那里,为着色。 – ephemient

0

字符类\ S将匹配空白字符和

例如:

$ sed -e "s/\s\{3,\}/ /g" inputFile 

将用两个空格替换至少3个空格的每个序列。

+0

不错! http://superuser.com/a/112837/91174 – mbrownnyc

2

grep输出的颜色信息采取特殊字符序列的形式(请参阅this StackOverflow question的回答),所以如果冒号是彩色的而且空白不是,反之亦然,则意味着这些字符序列中的一个将在它们之间,因此sed不会将它们看作相邻的字符。