
Ich muss reguläre Ausdrücke verwenden, um den gesamten Text ab dem Zeilenende und zwei Punkte zurück zu entfernen.
gtk2-2.24.22-2.fc20.x86_64
wird
gtk2-2.24.22-2
Dies ist die Ausgabe rpm -qa
einer Textdatei und ich muss das Ende abschneiden.
Antwort1
Tust dubrauchenein regulärer Ausdruck? Ich weiß, das ist eine etwas billige Lösung, aber reguläre Ausdrücke sind nicht für alles eine Lösung.
Beispielsweise mit der Bash-String-Manipulation:
foo="gtk2-2.24.22-2.fc20.x86_64"
echo ${foo%.*.*} # strip the longest match from the last dot
Kehrt zurück gtk2-2.24.22-2
.
Sie können dies für eine Datei wie folgt aufrufen:
foo=$(head -1 file.txt)
echo ${foo%.*.*} > new-file.txt
Reguläre Ausdrücke sind gut geeignet, um etwas von Anfang an zu analysieren, nicht von hinten, da sie „gierig“ von links nach rechts konsumieren. Das ist machbar, aber Sie müssen etwas ausführlicher sein, als Sie es in einfachem Bash tun könnten.
Beachten Sie, dass das, was in Bash wie ein regulärer Ausdruck aussieht ( .*
), kein „echter“ regulärer Ausdruck ist. In einem echten regulären Ausdruck .
steht der Punkt für alle Zeichen und *
bedeutet, dass das vorherige Zeichen (die Gruppe) 0–n-mal wiederholt wird. In Bash hingegen .
steht der Punkt für einen echten Punkt und *
ist ein Platzhalter für alle Zeichen.