2011-08-09 13 views
34

मैं 1_classification.dat, 2_classification.dat और इसी तरह की सभी टेक्स्ट फ़ाइलों में "नीली" से "लाल" शब्द को प्रतिस्थापित करना चाहता हूं। मैं एक ही फाइल को संपादित करना चाहता हूं इसलिए मैंने इस कोड को आजमाया लेकिन यह काम नहीं करता है। मुझसे कहां गलती हो रही है?पर्ल में किसी मौजूदा फ़ाइल में स्ट्रिंग को कैसे प्रतिस्थापित करें?

@files=glob("*_classification.dat"); 
foreach my $file (@files) 
{ 
    open(IN,$file) or die $!; 
    <IN>; 
    while(<IN>) 
    { 
     $_='~s/blue/red/g'; 
     print IN $file; 
    } 

    close(IN) 
} 

उत्तर

92

एक लाइनर के साथ कुछ भी गलत है?

$ perl -pi.bak -e 's/blue/red/g' *_classification.dat 

स्पष्टीकरण

  • -p प्रक्रियाओं, तो लाइन द्वारा <> लाइन प्रिंट
  • -i को सक्रिय करता है यथा-स्थान संपादन। फ़ाइलें .bak विस्तार
  • अंतर्निहित चर पर regex प्रतिस्थापन कार्य करते हैं, जो फ़ाइल की सामग्री का उपयोग कर रहे हैं ऊपर का समर्थन कर रहे हैं, पंक्ति-दर-पंक्ति
+6

डबल उद्धरण अगर आदेश, पर सभी विंडोज – Zaid

+0

हाँ, या कोई उद्धरण के तहत चलाया जाता है, तो कोड रिक्त स्थान शामिल नहीं है: यहाँ मैं क्या किया है। – bart

+4

तर्कों में '*' ग्लोबिंग का उपयोग करना विंडोज़ में काम नहीं करता है। – TLP

10

$_='~s/blue/red/g';

उह, क्या??

बस

s/blue/red/g; 

या, यदि आप एक चर का उपयोग कर पर जोर देते हैं (जो आवश्यक नहीं है जब $ _ का उपयोग कर, लेकिन मैं सिर्फ सही वाक्य रचना दिखाना चाहते हैं):

$_ =~ s/blue/red/g; 
2

कोई नहीं यहां मौजूद मौजूदा उत्तरों में से एक स्क्रिप्ट के भीतर से ऐसा करने का एक पूर्ण उदाहरण प्रदान किया गया है (एक लाइनर नहीं)।

rename($file, $file.'.bak'); 
open(IN, '<'.$file.'.bak') or die $!; 
open(OUT, '>'.$file) or die $!; 
while(<IN>) 
{ 
    $_ =~ s/blue/red/g; 
    print OUT $_; 
} 
close(IN); 
close(OUT); 
संबंधित मुद्दे

 संबंधित मुद्दे