シェル変数からスペースを削除するにはどうすればよいですか?


15

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

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

私はtr -d ' 'スペースを削除するために使用しようとしていますが、結果は次のとおりです:

namewithspace

私は次のようないくつかのことを試しました:

text=echo $text | tr -d ' '

これまでのところ運が悪いので、うまくいけば素晴らしい人々が助けることができます!

回答:


45

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

私もそれを考えていませんでしたが、これに取り組んでいるのはtr気分でした!素晴らしい答えも!
user3347022 14

11

echoコマンドはまったく必要ありません。代わりにHere Stringを使用してください。

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倍以上高速であることが本当に印象的です!


それは必ずしも真実ではありませんstackoverflow.com/q/14967299
スティーブンペニー14

5

以下のようにテキスト変数を変更するだけです。

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

ただし、制御文字がある場合、これは壊れる可能性があります。したがって、Kasperdの提案に従って、二重引用符で囲むことができます。そう、

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

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


素晴らしい!私はすっごく近かった。初心者として、私は正しい方向に向かっていたことを嬉しく思います!迅速な対応にも感謝します。8分待ったらすぐに回答として提出します。
user3347022 14

@ user3347022、どういたしまして:)
ラメシュ14

1
$textシェルによって解釈される制御文字が含まれている場合、これは壊れます。:ベターはそこにいくつかの二重引用符を置くtext="$(echo "$text" | tr -d ' ')"
kasperd

@kasperd、言及してくれてありがとう。あなたの提案を取り入れました。
ラメシュ14


2

数値を持つ変数が必要な特別な場合:

sh:

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

ksh:

typeset -n A=B #or
typeset -n A="   23232"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.