Antworten:
Ein Beispiel könnte nützlich gewesen sein, aber wenn ich Sie richtig verstanden hätte, würde dies funktionieren:
echo "Hello: world" | cut -f1 -d":"
Dies wird "Hallo: Welt" in "Hallo" umwandeln.
basenameund ausgeführt cutwerden. Siehe Dennis 'Antwort unten
cutkann von stdin lesen, daher ist es besser, besonders wenn Sie eine sehr lange Zeichenfolge haben, die Sie verarbeiten müssen, wie den Inhalt einer Datei.
hello: world. Das ist eine halbe Antwort.
In Bash (und ksh, zsh, dash usw.) können Sie die Parametererweiterung verwenden, mit %der Zeichen vom Ende der Zeichenfolge oder #Zeichen vom Anfang der Zeichenfolge entfernt werden. 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
hello:worldwerden wird hello:wodurch den Einsatz ${a%:*}?
"${a##*:}", nur zu bekommen tomorrow=)
a='hello:world:of:tomorrow'; pattern=''^([^:]*:).*$'; [[$ a = ~ $ pattern]]; echo "$ {BASH_REMATCH [1]}" `. Das passt nur, wenn es einen Doppelpunkt gibt. Wenn dies optional sein soll, muss ein anderes Muster verwendet werden. Eine Erklärung von Bash-Regexen (und Regexen im Allgemeinen) würde den Rahmen dieser Kommentare sprengen. Sie können andere Fragen finden, die dies diskutieren, oder Ihre eigenen posten.
egrep -o '^[^:]*:'
egrepist grep mit -E. Es macht hier keinen Unterschied zum regulären grep. -oweist grep an, nur den Teil der Zeile auszudrucken, der dem Ausdruck entspricht. ^verankert das Match am Anfang einer Linie. [^:]*Entspricht null oder mehr Zeichen, die nicht das :Zeichen sind. :passt zum Charakter :.
Angenommen, Sie haben einen Pfad mit einer Datei in diesem 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 der Verwendung von cut besteht darin, dass Sie sowohl das oberste Verzeichnis als auch die Datei (in diesem Beispiel) ausschneiden können, wenn Sie also eingeben
$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-3 -d"/"
Ihre Ausgabe wäre
/dirA/dirB
Obwohl Sie dasselbe von der anderen Seite der Zeichenfolge aus tun können, wäre dies in diesem Fall nicht so sinnvoll wie das Tippen
$ echo "/dirA/dirB/dirC/filename.file" | cut -f2-4 -d"/"
führt zu
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.
Schneiden Sie alles nach der letzten Instanz von ":" ab.
cat fileListingPathsAndFiles.txt | grep -o '^.*:'
und wenn Sie das letzte ":" fallen lassen wollten
cat file.txt | grep -o '^.*:' | sed 's/:$//'
@ kp123: Sie möchten ersetzen :durch /(wo der sed Doppelpunkt sein sollte \/)
cutfunktioniert, aber ich Dennis 'Antwort ist besser und flexibler. Weiß jemand, ob es einen neuen Prozess hervorbringt wiecut?