2010-04-11 7 views
22

Ich kann an Ort und Stelle nicht bekommen Bearbeitung Perl Einzeiler unter ActivePerl laufen zu arbeiten, wenn ich sie mit einer Backup-Erweiterung angeben:Warum muss ich bei Verwendung von ActivePerl die Option -i mit einer Backup-Erweiterung angeben?

C:\> perl -i -ape "splice (@F, 2, 0, q(inserted text)); $_ = qq(@F\n);" file1.txt 
Can't do inplace edit without backup. 

Der gleiche Befehl mit -i.bak oder -i.orig eine Behandlung funktioniert, sondern schafft eine unerwünschte Sicherungsdatei in diesem Prozess.

Gibt es einen Weg um dies?

Antwort

29

Dies ist eine Windows/MS-DOS-Einschränkung. Nach perldiag:

Du bist auf einem System wie MS-DOS, die, wenn Sie von einer gelöschten (aber immer noch geöffnet) Datei zu lesen versuchen, verwechselt wird. Du musst sagen -i.bak oder so etwas.

Perl -i Implementierung verursacht es file1.txt zu löschen, während ein offenes Handles, um es zu halten, erstellen Sie dann die Datei mit dem gleichen Namen. Dadurch können Sie Datei1.txt lesen, obwohl sie gelöscht wurde und neu erstellt wird. Unglücklicherweise erlaubt Ihnen Windows/MS-DOS nicht, eine Datei zu löschen, an die ein offenes Handle angehängt ist. Daher funktioniert dieser Mechanismus nicht.

Am besten ist es, -i.bak zu verwenden und dann die Sicherungsdatei zu löschen. Dies gibt Ihnen zumindest einen gewissen Schutz - Sie könnten beispielsweise entscheiden, das Backup nicht zu löschen, wenn perl mit einem Exit-Code ungleich Null beendet wird. Etwas wie:

perl -i.bak -ape "splice...." file1.txt && del file1.bak 
+0

So ist es eine Windows-Beschränkung. Ich hatte gehofft, dass ich das Backup nicht mit einem separaten Befehl "aufheben" müsste ... sieht so aus als müsste ich es tun. Danke für die Hilfe. – Zaid

+0

Nicht vollständig verwandt, aber in-Place-Bearbeitung auf Sed in Windows scheint für mich zu arbeiten. Ich kann sehen, dass Ihr Beispiel in sed nicht funktionieren würde, aber es könnte hilfreich sein zu wissen. – Mike

+0

@Mike: An meinem Ende, 'sed' In-Place-Bearbeitung verlässt temporäre Dateien wie z. 'sedGihEwg' im Dateisystem - Ihres nicht? Welche Version hast du? Ich benutze 'GNU sed Version 4.2.1'. – zb226

0

Probe mit rekursiven ändern und sowohl von Fund gemacht löschen. Arbeitet z.B. Mingw Git Bash auf Windows.

$ find . -name "*.xml" -print0 | xargs -0 perl -p -i.bak -e 's#\s*<property name="blah" value="false" />\s*##g' 
$ find . -name "*.bak" -print0 | xargs -0 rm 

Binär abgeschlossene Werte zwischen Find/Xargs übergeben, um Leerzeichen zu behandeln. Ungewöhnliche s/Präfix, um zu vermeiden, XML in Suchbegriff zu Manglen. Dies setzt voraus, dass Sie keine .bak Dateien hatten, die herumhingen, um zu beginnen.

Verwandte Themen