変数から文字を削除する方法はいくつかあります。
これまで私が見つけた最も短い方法は次のとおりです。tr
:
OUTPUT=a\'b\"c\`d_123and_a_lot_more
OUTPUT=$(echo "$OUTPUT"|tr -d "'\`\"")
echo $OUTPUT
より速い方法がありますか?
'
この引用は、およびそれ自体の"
ような引用に安全ですか`
?
ベストアンサー1
みましょう。私が考えることができる最も短いのは、ソリューションを適用したことですtr
。
OUTPUT="$(tr -d "\"\`'" <<<$OUTPUT)"
他の選択肢には、すでに述べた変数置換が含まれています。
OUTPUT="${OUTPUT//[\'\"\`]}"
もちろん、sed
これは文字の面でより長いです。
OUTPUT="$(sed s/[\'\"\`]//g <<<$OUTPUT)"
最小長さを意味するのか、最小時間を意味するのか分かりません。長さの観点からこれらの特定の文字を削除すると、これらの2つの文字は可能な限り短くなります(または私が得ることができるすべて)。それでは、どちらが最速ですか?変数を例の変数に設定してOUTPUT
テストしましたが、何十回も繰り返しました。
$ echo ${#OUTPUT}
4900
$ time tr -d "\"\`'" <<<$OUTPUT
real 0m0.002s
user 0m0.004s
sys 0m0.000s
$ time sed s/[\'\"\`]//g <<<$OUTPUT
real 0m0.005s
user 0m0.000s
sys 0m0.000s
$ time echo ${OUTPUT//[\'\"\`]}
real 0m0.027s
user 0m0.028s
sys 0m0.000s
お分かりのように、tr
明らかに最も速く、次のものですsed
。またecho
、実際には以下を使用するよりも少し速いようです<<<
。
$ for i in {1..10}; do
( time echo $OUTPUT | tr -d "\"\`'" > /dev/null ) 2>&1
done | grep -oP 'real.*m\K[\d.]+' | awk '{k+=$1;} END{print k/NR}';
0.0025
$ for i in {1..10}; do
( time tr -d "\"\`'" <<<$OUTPUT > /dev/null ) 2>&1
done | grep -oP 'real.*m\K[\d.]+' | awk '{k+=$1;} END{print k/NR}';
0.0029
違いが小さいため、両方のテストに対して上記のテストを10回実行した結果、最速のテストは実際に開始する必要があるテストであることがわかりました。
echo $OUTPUT | tr -d "\"\`'"
ただし、変数に割り当てるオーバーヘッドを考慮すると、状況が異なります。ここでの使用はtr
単純な交換よりも少し遅いです。
$ for i in {1..10}; do
( time OUTPUT=${OUTPUT//[\'\"\`]} ) 2>&1
done | grep -oP 'real.*m\K[\d.]+' | awk '{k+=$1;} END{print k/NR}';
0.0032
$ for i in {1..10}; do
( time OUTPUT=$(echo $OUTPUT | tr -d "\"\`'")) 2>&1
done | grep -oP 'real.*m\K[\d.]+' | awk '{k+=$1;} END{print k/NR}';
0.0044
したがって、要約すると、結果だけを見たいときに使用し、tr
変数に再割り当てしたいときは別のサブシェルを実行するオーバーヘッドを避けるため、シェルの文字列操作機能を使用する方が高速です。