Beispiel:
before: text_before_specific_character(specific_character)text_to_be_deleted
after: text_before_specific_character
Ich weiß, dass es mit 'sed' gemacht werden kann. Aber ich stecke fest. Kann mir jemand helfen?
Es gibt keinen Grund, dafür ein externes Tool wie sed zu verwenden. bash kann dies intern mithilfe der Parametererweiterung tun :
Wenn das Zeichen, nach dem Sie trimmen möchten :
, beispielsweise ist:
$ str=foo_bar:baz
$ echo "${str%%:*}"
foo_bar
Sie können dies sowohl auf gierige als auch auf nicht gierige Weise tun:
$ str=foo_bar:baz:qux
$ echo "${str%:*}"
foo_bar:baz
$ echo "${str%%:*}"
foo_bar
Insbesondere wenn Sie dies in einer engen Schleife aufrufen, kann das Starten eines neuen sed-Prozesses, das Schreiben in den Prozess, das Lesen seiner Ausgabe und das Warten auf das Beenden (um seine PID zu ernten) einen erheblichen Aufwand bedeuten, der die gesamte interne Verarbeitung ausführt Bash wird nicht haben.
Nun - oft, wenn dies tun zu wollen, was Sie vielleicht wirklich wollen , ist eine Variable in Felder aufgeteilt, die mit besser gemacht wird read
.
Angenommen, Sie lesen eine Zeile aus /etc/passwd
:
line=root:x:0:0:root:/root:/bin/bash
IFS=: read -r name password_hashed uid gid fullname homedir shell _ <<<"$line"
echo "$name" # will emit "root"
echo "$shell" # will emit "/bin/bash"
Selbst wenn Sie mehrere Zeilen aus einer Datei verarbeiten möchten, können Sie dies auch nur mit Bash und ohne externe Prozesse tun:
while read -r; do
echo "${REPLY%%:*}"
done <file
... gibt alles bis zum ersten :
aus jeder Zeile aus file
, ohne dass externe Tools gestartet werden müssen.
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen