it-swarm.com.de

Wie kann ich den gesamten Text nach einem Zeichen in Bash entfernen?

Wie kann ich den gesamten Text nach einem Zeichen, in diesem Fall einem Doppelpunkt (":"), in der Bash entfernen? Kann ich auch den Doppelpunkt entfernen? Ich habe keine Ahnung wie.

122
Natan

Ein Beispiel wäre vielleicht nützlich gewesen, aber wenn ich Sie richtig verstanden hätte, würde dies funktionieren:

echo "Hello: world" | cut -f1 -d":"

Dadurch wird "Hallo: Welt" in "Hallo" umgewandelt.

118
Eldad Mor

In Bash (und ksh, zsh, dash usw.) können Sie die Parametererweiterung mit % Verwenden, um Zeichen vom Ende der Zeichenfolge zu entfernen, oder mit #, Um Zeichen vom Anfang zu entfernen der Zeichenfolge. Wenn Sie ein einzelnes dieser Zeichen verwenden, wird die kleinste übereinstimmende Zeichenfolge entfernt. Wenn Sie das Zeichen verdoppeln, wird das längste entfernt.

$ a='hello:world'
$ b=${a%:*}
$ echo "$b"
hello
$ a='hello:world:of:tomorrow'
$ echo "${a%:*}"
hello:world:of
$ echo "${a%%:*}"
hello
$ echo "${a#*:}"
world:of:tomorrow
$ echo "${a##*:}"
tomorrow
226
$ echo 'hello:world:again' |sed 's/:.*//'
hello
5
sk8asd123
egrep -o '^[^:]*:'
4
cdhowie

Angenommen, Sie haben einen Pfad mit einer Datei im folgenden Format:

/dirA/dirB/dirC/filename.file

Jetzt möchten Sie nur den Pfad, der vier "/" enthält. Art

$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-4 -d"/"

und Ihre Ausgabe wird sein

/dirA/dirB/dirC

Der Vorteil von cut ist, dass Sie sowohl das oberste Verzeichnis als auch die Datei (in diesem Beispiel) ausschneiden können, wenn Sie also tippen

$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-3 -d"/"

ihre Ausgabe wäre

/dirA/dirB

Obwohl Sie dasselbe auch von der anderen Seite der Zeichenkette aus tun können, wäre es in diesem Fall weniger sinnvoll, etwas einzugeben

$ echo "/dirA/dirB/dirC/filename.file" | cut -f2-4 -d"/"

ergebnisse in

dirA/dirB/dirC

In einigen anderen Fällen kann auch der letzte Fall hilfreich sein. Beachten Sie, dass am Anfang der letzten Ausgabe kein "/" steht.

2
Nico Feulner