2010-04-11 8 views
22

Yerleşim düzenini alamıyorum ActivePerl altında çalışan bir linux uzantıları yedekleme uzantısıyla belirtmedikçe çalışmaz:Neden ActivePerl kullanırken -i anahtarını bir yedek uzantı ile belirtmek zorundayım?

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

-i.bak veya -i.orig ile aynı komut, bir işlem yapar ancak istenmeyen bir yedekleme dosyası oluşturur. süreç.

Bunun etrafında bir yolu var mı?

cevap

29

Bu bir Windows/MS-DOS sınırlamasıdır. perldiag göre:

Sen Silinen (ama yine de açık) Dosyadan okuma çalışırsanız karışır MS-DOS gibi bir sistem üzerinde konum. -i.bak, ya da bazılarını söylemelisin.

Perl'in -i uygulama buna açık tanıtıcı tutarken aynı adla dosyasını yeniden oluşturmak, ardından file1.txt silmek neden olur. Bu, silinmiş ve yeniden oluşturulmasına rağmen dosya1.txt dosyasını 'okumanıza' olanak tanır. Ne yazık ki, Windows/MS-DOS açık bir tanıtıcıya eklenmiş bir dosyayı silmenize izin vermez, bu nedenle bu mekanizma çalışmaz.

En iyi çekiminiz -i.bak kullanmak ve sonra da yedekleme dosyasını silmektir. Bu, en azından size biraz koruma sağlar - örneğin, sıfır olmayan bir çıkış koduyla perl çıkması durumunda yedeklemeyi seçemezsiniz. Şunlar gibi:

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

Bu bir Windows sınırlamasıdır. Yedeklemenin ayrı bir komuta ile bağlantısını kesmemeyi umuyordum ... zorunda olduğum gibi görünüyor. Yardım için teşekkürler. – Zaid

+0

Tamamen alakalı değil, ama pencerelerde sed üzerinde yerinde düzenleme benim için çalışıyor gibi görünüyor. Senin örneğinin sed olarak işe yaramayacağını görebiliyorum, ama bilmek yardımcı olabilir. – Mike

+0

@Mike: Sonunda, 'sed' yerinde düzenleme, örn. dosya sistemindeki "sedGihEwg" - seninki yok mu? Hangi sürüme sahipsiniz? GNU sed sürümü 4.2.1 kullanıyorum. – zb226

0

Özyinelemeli örnekleme ve silme ile her ikisini de bulun. Ör. windows üzerinde mingw git bash.

$ 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 

Boşlukları işlemek için find/xargs arasında ikili sonlandırılmış değerler geçti. Arama teriminde xml'yi önlemek için olağandışı s/öneki. Bu, başlamak için etrafında asılı herhangi bir .bak dosya olmadığını varsayar.