Löschen Sie das letzte Zeichen in einem Wort, aber nur, wenn das Zeichen vorhanden ist - in Bash

11

Wie entferne ich das letzte Zeichen nur, wenn es da ist?

Eingang:

OpenOffice.org/m
openOffice.org/ozm
Pers.
Pfg.
phil.
Prof. Prof.
bzw.
Roonstr./m
roonstr./ozm

gewünschte Ausgabe:

OpenOffice.org
openOffice.org
Pers
Pfg
phil
Prof
bzw
Roonstr
roonstr

Ich habe es so weit gebracht, dass nur noch der Punkt übrig ist, aber leider entfernt der letzte sed-Befehl auch den Buchstaben g: $ cat filename | grep "\." | cut -d"/" -f1 | sed 's/.$//'

entfernen Sie das letzte Mal, wenn es dort ist
quelle

Antworten:

12

Sie müssen nur dem Punkt in Ihrem sedBefehl entkommen und alles wird gut. So was:

sed 's/\.$//'

Denn falls Sie nicht entkommen, .$wird mit jedem Zeichen am Ende der Zeichenfolge übereinstimmen.

Sie können auch alle Ihre sed+ grep+ cutin nur eine setzen sed:

sed 's=/[^/]*$==;s/\.$//' filename
eilen
quelle
Großartig, danke, funktioniert! :) Ich benutze ein Wörterbuch mit über 300.000 Zeilen, deshalb verwende ich grep "\." um dort nur die Wörter mit einem Punkt zu bekommen.
Entfernen Sie das letzte Mal
sed kann es auch mit so etwas machen : sed -n '/\./{s=/[^/]*$==;s/\.$//;p}. Wie auch immer grep+ sedwird viel länger als nur eine arbeiten sed.
Eile
Wenn es mit einem Sed gemacht werden kann, wäre es aber schön. Wie wende ich meinen letzten sed-Befehl an?
Entfernen Sie das letzte Mal
sed 's/[./]\+[^./]*$//'
Peter.O
Danke jetzt brauche ich keinen Schnitt, aber grep ist immer noch da. Ein sed-Äquivalent meines gepipten grep-Befehls würde dann das grep entfernen, wenn es möglich wäre, wäre es schön. "Sie können auch alle Ihre sed + grep + cut in nur eine sed setzen" funktioniert bei mir nicht, druckt alle Wörter?
Entfernen Sie das letzte Mal
1

Das Entfernen eines Zeichens nur dann, wenn es vorhanden ist, enthält genau die Beschreibung der Parametererweiterungen.

 $ var=path.
 $ echo "$var    ${var%.}"
 path.    path

Der Punkt ist in diesem Fall nichts Besonderes (ein Punkt ist etwas Besonderes in einem regulären Ausdruck).

Das andere Muster könnte entfernt werden mit %/*:

 $ var=openOffice.org/ozm
 $ echo "${var%/*}"
 openOffice.org

So entfernen Sie beide:

 $ var=roonstr./ozm
 $ var=${var%/*}
 $ var=${var%.}
 $ echo "$var"
 roonstr

Um mit einer Quelldatei zu arbeiten, ist es natürlich schneller, sed für die Datei zu verwenden.
Denken Sie nur daran, den Punkt zu zitieren (um ihn wörtlich zu finden, sonst bedeutet es: ein beliebiges Zeichen).

 $ sed 's,/.*,,;s,\.$,,' file
Isaac
quelle
Dies sollte die akzeptierte Antwort sein. Benötigt mehr Upvotes.
David Parks
0

Ändern Sie einfach leicht Ihren regulären Ausdruck: um dem zu entkommen . Und Sie brauchen nichtgrep

cat filename | cut -d"/" -f1 | sed 's/\.$//'
medifle
quelle