sed 空白匹配混淆

Ben*_*ebe 8 sed

echo ' 1 2     3  '|sed 's/[[:space:]]*/_/g'
Run Code Online (Sandbox Code Playgroud)

我想看到_1_2_____3__作为输出。相反,我将其_1_2_3_视为输出。我究竟做错了什么??

编辑
另一件让我困惑的事情,我忘了在上面的例子中,这是为什么:

echo ' test1 test2  ' | sed 's/[[:space:]]*/_/g'
Run Code Online (Sandbox Code Playgroud)

显示这个:

_t_e_s_t_1_t_e_s_t_2_
Run Code Online (Sandbox Code Playgroud)

和和...[[:space:]]之间如何匹配?tes

cuo*_*glm 15

因为您使用*,这意味着它匹配 0 个或多个空格。所以零个或多个空格被一个下划线代替_

尝试:

$ echo ' 1 2     3  ' | sed 's/[[:space:]]/_/g'
_1_2_____3__
Run Code Online (Sandbox Code Playgroud)

请记住,[[:space:]]它还匹配制表符、换行符、回车符。

笔记


jim*_*mij 5

你已经有了答案,但我想指出,在这种简单的情况下,没有必要花哨:

$ echo ' 1 2     3  ' | sed 's/ /_/g'
_1_2_____3__
Run Code Online (Sandbox Code Playgroud)

如果您只想替换空格和制表符,您也可以使用 [ \t] 构造:

$ echo -e " 1\t2     3  " | sed 's/[ \t]/_/g'
_1_2_____3__
Run Code Online (Sandbox Code Playgroud)