
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:]]
?t
e
s
答え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に変更することである場合は、「作業に適したツール」を使用して文字を翻訳する代替答えがありますtr
。man 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_