私はコマンドラインで次のことを行いました:
$ text="name with space"
$ echo $text
name with space
私はtr -d ' '
を使用してスペースを削除し、次の結果を得ようとしています:
namewithspace
私はいくつかのことを試しました:
text=echo $text | tr -d ' '
今のところ運が悪いので、うまくいけばあなたの素晴らしい人々が助けてくれるでしょう!
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
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倍以上速いことです。
以下のようにテキスト変数を変更するだけです。
text=$(echo $text | tr -d ' ')
ただし、制御文字がある場合、これは壊れる可能性があります。したがって、Kasperdの提案に従って、二重引用符で囲むことができます。そう、
text="$(echo "$text" | tr -d ' ')"
より良いバージョンになります。
$ sed 's. ..g' <<< $text
namewithspace
数値を持つ変数が必要な場合の特別なケース:
sh:
typeset -i A=B #or
typeset -i A=" 23232"
ksh:
typeset -n A=B #or
typeset -n A=" 23232"