Ich habe eine Datei, die Ganzzahlen (Zeilennummern) und Text enthält. Beim Extrahieren einer PDF-Datei wurden diese Zeilennummern in separate Zeilen vom Text eingefügt und ich möchte alle diese Zeilennummern löschen. Ich bin nicht sehr erfahren mit regulären Ausdrücken, aber ich bin 100 % sicher, dass es nicht allzu schwer sein sollte. Ich verwende vim/nvim, aber wenn ich awk/sed verwenden müsste, würde das auch für mich funktionieren.
Die Datei sieht ungefähr so aus:
123
124
125
Text was found in
those three lines
should stay
Idealerweise möchte ich also nach allen Zeilen suchen, die mit einer positiven Ganzzahl (1,2,3...123456) beginnen und nichts anderes als diese Ganzzahl enthalten. Sie sollten gelöscht werden.
Jede Hilfe wird sehr geschätzt.
Bonus-Herausforderung: Aus irgendeinem Grund beginnen einige Zeilen mit ^L1234
, es gibt also ein zusätzliches Sonderzeichen. Irgendwann möchte ich diese auch löschen. Kann aber in separaten Schritten erfolgen.
Antwort1
[0-9]
ist eine einfacheSammlungvon Ziffern, die fast überall funktioniert. In Vim können Sie auch\d
(Dezimalziffer) verwenden.- Sie möchten eine oder mehrere Instanzen: hängen Sie den
\+
Multiplikator an. - Das sollte das einzige sein, was in der Zeile steht, daher muss der reguläre Ausdruckverankertzum Anfang und Ende (über
^
bzw.$
). - Sie möchten eine Übereinstimmung für alle Zeilen versuchen. In Vim erfolgt dies über
:global/{pattern}/
. - Passende Zeilen sollten
:delete
d sein.
Zusammen genommen:
:global/^[0-9]\+$/delete
Sie können auch verwenden sed
; das ist schneller und funktioniert nicht interaktiv. Da hierdurch automatisch alle Regeln auf alle Eingabezeilen angewendet werden, benötigen Sie das nicht :global
, und das :delete
ist einfach d
da. Mit -i
wird der Ersatz direkt vor Ort durchgeführt (achten Sie also darauf, dass es richtig ist und haben Sie eine Sicherungskopie der Originaldatei!)
sed -i -e '/^[0-9]\+$/d' file
Für das optionale Präfix lautet der Multiplikator dafür \?
. Wenn es sich dabei ^L
um ein einzelnes Zeichen handelt, müssen Sie es in Vim wahrscheinlich als eingeben <C-V><C-L>
.
Antwort2
Entfernen Sie in Vim Zeilen, die mit Ganzzahlen beginnen und nur Ganzzahlen enthalten
:%s/^[0-9]\+\n//gc
Erläuterung
:%s//
- globales Suchen und Ersetzen^
- am Zeilenanfang beginnen[0-9]
- Ziffern abgleichen\+
- Greedy Match eins oder mehr\n
Zeilenumbruch anpassen (Hinweis: Überprüfen Sie Ihre Zeilenenden, diese sind je nach System unterschiedlich und können\r\n
stattdessen zB lauten)gc
- globale Übereinstimmung + bestätigen (entfernen,c
wenn es viele gibt oder Sie sicher sind
Ausgabe
123
124
125
Text was found in
those three lines
should stay
:%s/^[0-9]*\n//g
Text was found in
those three lines
should stay
Bonus
ProTerdons Antwort auf U&L, das ^L
ist das form feed character
, das entfernt werden kann mit sed
:
sed 's/\o14//g' file
Es lohnt sich, die Antwort zu lesen, um weitere Möglichkeiten kennenzulernen.