sed: letztes Auftreten eines Zeichens in Datei

23/01/2013 - 10:46 von Ralph Stahl | Report spam
Moin!

Folgende Aufgabe steht:

Eine Datei enthàlt mehrere Zeichenketten '?>'. Falls die in der letzten
Zeile steht oder nur noch Leerzeilen oder -zeichen danach kommen, soll
es gegen nichts '' ersetzt werden.

(Der Zweck: PHP-Dateien sollten kein schließendes PHP-Tag am Ende haben.
In einigen meiner alten großen Projekte haben sie das aber alle,
deswegen möchte ich das über ein Script bereinigen.)

Das Problem: in einem File einfach nur sowas wie

sed 's/\?>\s*$//'

zu machen, geht schief. Dabei werden alle Vorkommen mittendrin mit
gelöscht, die aber erhalten bleiben sollen. Weil sed zeilenweise
arbeitet und es kein Kriterium für "letzte Zeile" gibt (EOF ist kein
testbares Zeichen).

Möglicher Ansatz:

Bekomme ich sed mit einer "Hilfskonstruktion" drumrum irgendwie dazu,
eine Datei (besser: alle Dateien im Verzeichnis) quasi von hinten
aufzurollen und somit die nun ersten Zeilen, die nur /\s*/ oder
/\s*\?>\s*/ enthalten, gànzlich löschen zu können?

Ich wàre für Tips dankbar.
Ralph
 

Lesen sie die antworten

#1 Dirk Thierbach
23/01/2013 - 13:04 | Warnen spam
Ralph Stahl wrote:
Eine Datei enthàlt mehrere Zeichenketten '?>'. Falls die in der letzten
Zeile steht oder nur noch Leerzeilen oder -zeichen danach kommen, soll
es gegen nichts '' ersetzt werden.

Ich wàre für Tips dankbar.



Muss es sed sein? IIRC arbeitet das immer zeilenweise, aber Du willst
ja gegen "nur folgende Leerzeichen oder LF, dann Dateiende" matchen.

Warum nicht

perl -pi -e 's/\?\>\s*$//s' dateinamen

oder so etwas (nicht getestet, enthaelt mit Sicherheit Fehler)?

- Dirk

Ähnliche fragen