sed スペースマッチ混乱

sed スペースマッチ混乱
echo ' 1 2     3  '|sed 's/[[:space:]]*/_/g'

_1_2_____3__出力を見たいです。代わりに、私はそれを_1_2_3_出力として見る。私は何が間違っていましたか? ?

編集する
私を混乱させるもう一つのことは、上記の例で言及していないことです。その理由は次のとおりです。

echo ' test1 test2  ' | sed 's/[[:space:]]*/_/g'

これを見せてください:

_t_e_s_t_1_t_e_s_t_2_

andの間を一致させる方法... [[:space:]]?tes

答え1

を使用したため、*ゼロ個以上の空白と一致するという意味です。したがって、ゼロ個以上のスペースが下線で置き換えられます_

努力する:

$ echo ' 1 2     3  ' | sed 's/[[:space:]]/_/g'
_1_2_____3__

[[:space:]]タブ、改行、およびキャリッジリターンとも一致することを忘れないでください。

ノート

答え2

すでに答えを知っていますが、このような単純なシナリオでは派手な必要はないことを指摘したいと思います。

$ echo ' 1 2     3  ' | sed 's/ /_/g'
_1_2_____3__

スペースとタブのみを置き換えるには、[ \ t]構造を使用することもできます。

$ echo -e " 1\t2     3  " | sed 's/[ \t]/_/g'
_1_2_____3__

答え3

この質問は、sed正規表現構文に関する非常に有効な質問であるsedについて明示的に尋ねます。

しかし、根本的な問題が_スペースをtrueに変更することである場合は、「作業に適したツール」を使用して文字を翻訳する代替答えがありますtrman tr)。

このコマンドは、tr abc 123最初のリストの文字を2番目のリストの対応する文字に置き換えます。したがって、tr ' ' _スペースを下線に置き換えます。

$ echo ' 1 2     3  ' | tr ' ' _
_1_2_____3__


あなたの例のようなすべての種類のスペースを含むより一般的なケースを示すために、
比較のために一般的なスペース文字を変換した結果は次のとおりです' '

echo ' 1 2     3  x\ny\tz' | tr ' ' _        
_1_2_____3__x
y       z

_:space: クラスのすべての文字を :: に変換するときの出力です。

echo ' 1 2     3  x\ny\tz' | tr '[:space:]' _
_1_2_____3__x_y_z_

(出力の末尾に改行文字がなく、_その後に1つがあることに注意してくださいz。)これは、短縮形式で
明示的に作成できます。tr ' \t\n' _tr ' \t\n' ___

$ echo ' 1 2     3  x\ny\tz' | tr ' \t\n' _    
_1_2_____3__x_y_z_

関連情報