entferne bestimmte Zeichen aus einer Variablen mit bash

123

Ich möchte eine Variable analysieren (in meinem Fall ist es die Development-Kit-Version), um sie dot ( .) -frei zu machen . Wenn version='2.3.3'ja, ist die gewünschte Ausgabe 233.

Ich habe es wie folgt versucht, aber es muss .durch einen anderen Charakter ersetzt werden, der mir das gibt 2_3_3. Es wäre in Ordnung gewesen, wenn tr . ''es funktioniert hätte.

  1 VERSION='2.3.3' 
  2 echo "2.3.3" | tr . _
Gebet
quelle
10
Nein, es nicht erforderlich ist : echo "2.3.3" | tr -d ..
Manatwork
1
@manatwork Großartig, das funktioniert. Sie können es als Antwort posten. Vielen Dank
prayagupd
1
Viele gute Antworten. Aber wenn ich das Ziel noch einmal erraten kann, sei gewarnt vor 2.11.3 und 2.1.13 ... ;-).
Rmano
1
@ Rmano Du meinst so etwas wie VERSION='2.30.3100'? Egal was gerade .entfernt wird mit allen Antworten hier.
Prayagupd
2
@PrayagUpd --- Ich habe einfach gemeint, dass, wenn Sie die Zahl nach der Konvertierung für Vergleiche verwenden (um zu sagen, ob "diese Version neuer oder dieselbe ist"), Sie sich um Fälle wie 2.11.3 und 2.1.13 kümmern sollten - - Sie scheinen nach der Punktentfernung gleich zu sein, aber 2.11.3 ist eindeutig neuer. Auch 2.11.3 ist neuer als 2.1.14, aber der Vergleich von 2113 und 2114 führt zu einer falschen Antwort. Ich erinnere mich an einen Fehler dafür ...
Rmano

Antworten:

136

Es muss kein externes Programm ausgeführt werden. bashDie String-Manipulation von kann damit umgehen (auch verfügbar in ksh(woher es kommt) und zsh):

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

(In den Handbüchern dieser Shells finden Sie dies im Abschnitt zur Parametererweiterung.)

Mann bei der Arbeit
quelle
19
Für weitere Details lautet die Syntax der obigen Antwort ${string//substring/replacement}, wobei anscheinend das Fehlen des endgültigen Schrägstrichs und der Ersetzungszeichenfolge als Löschen interpretiert wird . Sehen Sie hier .
Sherrellbc
5
Richtig, man bashheißt es deutlich im Abschnitt Shell Parameter Expansion : „ ${parameter/pattern/string}(…) Wenn der String null ist, werden Übereinstimmungen des Musters gelöscht und das /folgende Muster kann weggelassen werden.“
manatwork
1
Mein Problem war, dass die Versionsnummer so kam "1.0.0"und ich wollte nur die Nummer, also folge dem, was @manatwork vorschlug, das ich geändert habe: "${VERSIONNUM//'"'}"Ich füge sie jedoch ein, auch ' ' weil sie sonst nicht den ""gleichen String zum Abheben erkennen würde.
Alexiscanny
1
@Alexiscanny, meinst du wörtliche "sind im Wert vorhanden? Ich fürchte , diese als neue Frage zählt, sondern versuchen, nur die double zu entkommen: "${VERSIONNUM//\"}" pastebin.com/3ECDtkwH
Manatwork
1
Hervorragend!! funktioniert -ashauch!
Fr0zenFyr
88

In chronologischer Reihenfolge:

tr / sed

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

csh / tcsh

echo $VERSION:as/.//

POSIX-Schalen:

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

ksh / zsh / bash / yash (und busybox ashwenn gebaut mit ASH_BASH_COMPAT)

echo "${VERSION//.}"

zsh

echo $VERSION:gs/./
Stéphane Chazelas
quelle
1
tr -d löschte sogar einzelne Zeichen aus dem Satz. Zum Beispiel möchte ich DCC_ aus "DCC_VersionD" löschen. Es löscht DCC und D. Erwartete Ausgabe: VersionD. Tatsächliche Ausgabe: Version. sed wirkte wie ein Zauber. :) danke für den Beitrag.
Kayle
20

Zusätzlich zu den erfolgreichen Antworten gibt es bereits. Dasselbe kann trmit der --deleteOption erreicht werden.

echo "2.3.3" | tr --delete .

Welches wird ausgegeben: 233

daz
quelle
6
auf Macos wird die --deleteFlagge nicht erkannt, aber Sie können -dstattdessen verwenden
Anentropic
6

du solltest es sedstattdessen mit versuchen

sed 's/\.//g'

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

Das würde nur Ziffern zurückgeben, egal welche anderen Zeichen vorhanden sind

user2796674
quelle
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

Wenn $VERSIONnur Ziffern und Punkte enthalten sind, können wir etwas noch kürzeres machen:

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

(Vorsicht, es handelt sich um eine Sicherheitsanfälligkeit durch Code-Injection, die $VERSIONmöglicherweise Zeichen enthält).

AWK

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

Oder dieses:

$ awk '{gsub(/\./,"")}1' <<< "$VERSION"
233
Sergiy Kolodyazhnyy
quelle