bashを使用して変数から特定の文字を削除します


123

変数(私の場合は開発キットバージョン)を解析して、dot(.)を無料にします。の場合version='2.3.3'、目的の出力は233です。

私は以下のように試しましたが、.私を与える別のキャラクターに置き換える必要があります2_3_3。うまく行けば大丈夫tr . ''だっただろう。

  1 VERSION='2.3.3' 
  2 echo "2.3.3" | tr . _

10
いいえ、必要ありません:echo "2.3.3" | tr -d .
マナトワーク

1
@manatwork素晴らしい、それは動作します。回答として投稿できます。おかげで
prayagupd

1
たくさんの良い答え。しかし、もし私が目標を推測できるなら、2.11.3と2.1.13について警告されます... ;-)数字にパディングゼロを追加することを検討してください。
Rmano

1
@RmanoのようなものVERSION='2.30.3100'ですか?何があってちょうど.のここにすべての答えで除去されていません。
prayagupd

2
@PrayagUpd ---変換後の数値を比較に使用する場合(「このバージョンの方が新しいか同じか」など)、2.11.3や2.1.13のようなケースに注意する必要があるということです- -ドットを削除した後も同じように見えますが、明らかに2.11.3の方が新しいです。また、2.11.3は2.1.14よりも新しいですが、2113と2114を比較すると間違った答えになります。私はこのためにどこかにバグを覚えている...
Rmano

回答:


136

外部プログラムを実行する必要はありません。bash文字列操作はそれを処理することができますksh((から来る)およびでも利用可能ですzsh):

$ VERSION='2.3.3'
$ echo "${VERSION//.}"
233

(これらのシェルのマニュアルでは、パラメーター拡張セクションでこれを見つけることができます。)


19
詳細については、上記の答えの構文は${string//substring/replacement}であり、明らかに最後のスラッシュと置換文字列の欠如はdeleteとして解釈されます。こちらをご覧ください
sherrellbc

5
右、シェルパラメータ拡張セクションman bashで明確に述べています:「(…)文字列がnullの場合、パターンの一致は削除され、次のパターンは省略される場合があります。」${parameter/pattern/string}/
manatwork

1
私の問題は、バージョン番号がこのよう "1.0.0"になり、@ manatworkが私が変更したことを示唆したものに従ってください。"${VERSIONNUM//'"'}"しかし' ' 、そうしないと、""好きな文字列が認識されないため挿入します。
アレクシスカニー

1
@Alexiscanny、リテラル"が値に存在するということですか?私は、これは新しい質問としてカウント怖いが、ちょうどダブルクォートをエスケープしてみてください:"${VERSIONNUM//\"}" pastebin.com/3ECDtkwH
manatwork

1
素晴らしいです!!でも動作し-ashます!
Fr0zenFyr

88

時系列順に:

tr / sed

echo "$VERSION" | tr -d .
echo "$VERSION" | sed 's/\.//g'

csh / tcsh

echo $VERSION:as/.//

POSIXシェル:

set -f
IFS=.
set -- $VERSION
IFS=
echo "$*"

ksh / zsh / bash / yash(およびでビルドされたash場合はbusybox ASH_BASH_COMPAT

echo "${VERSION//.}"

zsh

echo $VERSION:gs/./

1
tr -dは、セットから1文字も削除しました。Ex iの場合、「DCC_VersionD」からDCC_を削除すると、DCCとDが削除されます。期待される出力はVersionDです。実際の出力:バージョン。sedは魅力のように機能しました。:)投稿してくれてありがとう。
カイル

20

成功した答えに加えて、すでに存在します。オプションを使用してtr、同じことを実現でき--deleteます。

echo "2.3.3" | tr --delete .

出力されるもの: 233


6
macosでは--deleteフラグは認識されませんが、-d代わりに使用できます
-Anentropic

6

sed代わりに試してみてください

sed 's/\.//g'


4
echo "$VERSION" | tr -cd [:digit:]

他の文字が何であれ、数字のみを返します


4

Perl

$ VERSION='2.3.3'                                     
$ perl -pe 's/\.//g' <<< "$VERSION"           
233

Python

$ VERSION='2.3.3'                                     
$ python -c 'import sys;print sys.argv[1].replace(".","")' "$VERSION"
233

$VERSION数字とドットのみが含まれている場合は、さらに短くすることができます。

$ python -c 'print "'$VERSION'".replace(".","")'
233

$VERSION文字が含まれている場合でも、コードインジェクションの脆弱性に注意してください)。

AWK

$ VERSION='2.3.3'
$ awk 'BEGIN{gsub(/\./,"",ARGV[1]);print ARGV[1]}' "$VERSION"
233

またはこれ:

$ awk '{gsub(/\./,"")}1' <<< "$VERSION"
233
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.