シェル変数からスペースを削除する方法は?

シェル変数からスペースを削除する方法は?

コマンドラインで次のことを行いました。

$ text="name with space"
$ echo $text
name with space

tr -d ' '次の結果を使用してスペースを削除しようとしています。

namewithspace

私は次のいくつかを試しました。

text=echo $text | tr -d ' '

これまでは運が良くなかったので、助けてくれることを願っています!

答え1

Bashでは、Bashに組み込まれた文字列操作を使用できます。この場合、次のことができます。

> text="some text with spaces"
> echo "${text// /}"
sometextwithspaces

文字列操作演算子の詳細については、次を参照してください。http://tldp.org/LDP/abs/html/string-manipulation.html

しかし、元の戦略も機能しますが、構文は少し異なります。

> text2=$(echo $text | tr -d ' ')
> echo $text2
sometextwithspaces

答え2

echoコマンドはまったく必要ありません。ただ使用してください。ここで文字列代わりに:

text=$(tr -d ' ' <<< "$text")

好奇心が強いさまざまなツールを使用して、これらのマイナーな作業を完了するのにかかる時間を確認しました。最も遅いものから最も速いものの順に並べられた結果は次のとおりです。

abc="some text with spaces"

$ time (for i in {1..1000}; do def=$(echo $abc | tr -d ' '); done)
0.76s user 1.85s system 52% cpu 4.976 total

$ time (for i in {1..1000}; do def=$(awk 'gsub(" ","")' <<< $abc); done)
1.09s user 2.69s system 88% cpu 4.255 total

$ time (for i in {1..1000}; do def=$(awk '$1=$1' OFS="" <<< $abc); done)
1.02s user 1.75s system 69% cpu 3.968 total

$ time (for i in {1..1000}; do def=$(sed 's/ //g' <<< $abc); done)
0.85s user 1.95s system 76% cpu 3.678 total

$ time (for i in {1..1000}; do def=$(tr -d ' ' <<< $abc); done)
0.73s user 2.04s system 85% cpu 3.244 total

$ time (for i in {1..1000}; do def=${abc// /}; done)
0.03s user 0.00s system 59% cpu 0.046 total

純粋なシェル作業が確かに最速のものは驚くべきことではありませんが、本当に印象的なのは、最も遅いコマンドよりも100倍以上速いということです!

答え3

次のようにテキスト変数を変更します。

text=$(echo $text | tr -d ' ')

ただし、制御文字があると壊れることがあります。したがって、Kasperdが提案したように、周囲に二重引用符を入れることができます。だから、

text="$(echo "$text" | tr -d ' ')"

より良いバージョンになります。

答え4

数値を含む変数が必要な特別な場合:

シェン:

typeset -i A=B #or
typeset -i A="   23232"

クッシュ:

typeset -n A=B #or
typeset -n A="   23232"

関連情報