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.
basename
und ausgeführt cut
werden. Siehe Dennis 'Antwort unten
cut
kann 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:world
werden wird hello:wo
durch 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 '^[^:]*:'
egrep
ist grep mit -E
. Es macht hier keinen Unterschied zum regulären grep
. -o
weist 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 \/
)
cut
funktioniert, aber ich Dennis 'Antwort ist besser und flexibler. Weiß jemand, ob es einen neuen Prozess hervorbringt wiecut
?