2010-04-11 14 views
22

मुझे एंट्रीपर्ल के तहत चलने वाले पर्ल एक-लाइनर काम नहीं कर सकते हैं जब तक कि मैं उन्हें बैकअप एक्सटेंशन के साथ निर्दिष्ट नहीं करता:ActivePerl का उपयोग करते समय मुझे बैकअप एक्सटेंशन के साथ -i स्विच क्यों निर्दिष्ट करना होगा?

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 या -i.orig के साथ एक ही कमांड एक इलाज करता है लेकिन एक अवांछित बैकअप फ़ाइल बनाता है प्रक्रिया।

क्या इसके आसपास कोई रास्ता है?

उत्तर

29

यह एक विंडोज़/एमएस-डॉस सीमा है। perldiag के अनुसार:

आप इस तरह MS-DOS के रूप में एक प्रणाली भ्रमित हो जाता है कि यदि आप एक नष्ट कर दिया (लेकिन अभी भी खोला) फ़ाइल से पढ़ने की कोशिश कर रहे हैं। आपको कहना है- i.bak, या कुछ ऐसे।

पर्ल के -i कार्यान्वयन यह file1.txt नष्ट करने के लिए यह करने के लिए एक खुला संभाल रखते हुए, तो एक ही नाम के साथ फाइल फिर से बनाने का कारण बनता है। यह आपको फ़ाइल 1.txt को 'पढ़ने' की अनुमति देता है भले ही इसे हटा दिया गया हो और फिर से बनाया जा रहा हो। दुर्भाग्यवश, विंडोज़/एमएस-डॉस आपको उस फ़ाइल को हटाने की अनुमति नहीं देता है जिसमें इसके साथ जुड़ा एक खुले हैंडल है, इसलिए यह तंत्र काम नहीं करता है।

आपका सर्वश्रेष्ठ शॉट -i.bak का उपयोग करना है और फिर बैकअप फ़ाइल को हटा देना है। यह कम से कम आपको कुछ सुरक्षा देता है - उदाहरण के लिए, यदि आप perl गैर-शून्य निकास कोड से बाहर निकलते हैं तो आप बैकअप को न हटाने का विकल्प चुन सकते हैं। कुछ ऐसा:

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

तो यह एक विंडोज़ सीमा है। मैं उम्मीद कर रहा था कि मुझे एक अलग कमांड के साथ बैकअप को अनलिंक नहीं करना होगा ... ऐसा लगता है कि मुझे करना होगा। सहायता के लिए धन्यवाद। – Zaid

+0

पूरी तरह से संबंधित नहीं है, लेकिन खिड़कियों में sed पर जगह में संपादन मेरे लिए काम करता प्रतीत होता है। मैं देख सकता हूं कि आपका उदाहरण sed में काम नहीं करेगा, लेकिन यह जानना सहायक हो सकता है। – Mike

+0

@ माइक: मेरे अंत में, 'sed' जगह संपादन संपादन अस्थायी फ़ाइलों जैसे उदा। फाइल सिस्टम में 'sedGihEwg' - तुम्हारा नहीं है? आपको कौन सा संस्करण मिला है? मैं 'जीएनयू sed संस्करण 4.2.1' का उपयोग कर रहा हूँ। – zb226

0

रिकर्सिव संशोधित के साथ नमूना संशोधित करें और दोनों को हटाकर हटाएं। उदाहरण पर काम करता है खिड़कियों पर mingw गिट बैश।

$ 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 

रिक्त स्थान को संभालने के लिए खोज/xargs के बीच बाइनरी समाप्त मूल्यों को पारित किया गया। खोज शब्द में mmlling mml से बचने के लिए असामान्य एस/उपसर्ग। यह मानता है कि आपके पास शुरू करने के लिए चारों ओर लटकने वाली .bak फ़ाइलें नहीं थीं।