perl मैं बल्क खोज कैसे कर सकता हूं और पर्ल के साथ बदल सकता हूँ?




replace bulk (4)

मेरे पास निम्न स्क्रिप्ट है जो एक इनपुट फ़ाइल, आउटपुट फ़ाइल में लेती है और स्ट्रिंग को किसी अन्य स्ट्रिंग के साथ इनपुट फ़ाइल में बदल देती है और आउटपुट फ़ाइल को लिखती है।

मैं फ़ाइलों की एक निर्देशिका के माध्यम से पार करने के लिए स्क्रिप्ट को बदलना चाहता हूँ, अर्थात् इनपुट और आउटपुट फाइलों के लिए संकेत देने के बजाय, स्क्रिप्ट को एक निर्देशिका पथ जैसे सी: \ temp \ allFilesTobeReplaced \ और स्ट्रिंग x के लिए खोज करना चाहिए और इसे बदलना चाहिए उस निर्देशिका पथ के अंतर्गत सभी फ़ाइलों के लिए वाई के साथ और एक ही फाइलें लिखें।

मैं यह कैसे करु?

धन्यवाद।

$file=$ARGV[0];

open(INFO,$file);
@lines=<INFO>;
print @lines;

open(INFO,">c:/filelist.txt");

foreach $file (@lines){
   #print "$file\n";
   print INFO "$file";
}

#print "Input file name: ";
#chomp($infilename = <STDIN>);

if ($ARGV[0]){
   $file= $ARGV[0]
}

print "Output file name: ";
chomp($outfilename = <STDIN>);
print "Search string: ";
chomp($search = <STDIN>);
print "Replacement string: ";
chomp($replace = <STDIN>);

open(INFO,$file);
@lines=<INFO>;
open(OUT,">$outfilename") || die "cannot create $outfilename: $!";

foreach $file (@lines){    
    # read a line from file IN into $_
    s/$search/$replace/g; # change the lines
    print OUT $_; # print that line to file OUT
}
close(IN);
close(OUT);


आप यह -i परम के साथ कर सकते हैं:

बस सभी फ़ाइलों को सामान्य रूप से संसाधित करें, लेकिन इसमें शामिल हैं- i.bak:

#!/usr/bin/perl -i.bak

while ( <> ) {
   s/before/after/;
   print;
}

यह प्रत्येक फ़ाइल को संसाधित करना चाहिए, और मूल को original.bak का नाम बदलें और निश्चित रूप से आप इसे एक-लाइनर के रूप में कर सकते हैं जैसा कि @ जेमी कुक


perl -pi -e के # पुराने # नया # जी 'फ़ाइल का नाम आप फ़ाइल नाम को अपनी फ़ाइल सूची के अनुकूल होने वाले पैटर्न के साथ बदल सकते हैं।


पर्ल एकल लाइनर का उपयोग

perl -pi -e 's/original string/new string/' filename

निम्न File::Find एकल स्क्रिप्ट देने के लिए File::Find के साथ मिलाया जा सकता है (यह एक ऐसा टेम्प्लेट है, जो मैं कई ऐसी कार्रवाइयों के लिए उपयोग करता हूं)।

use File::Find;

# search for files down a directory hierarchy ('.' taken for this example)
find(\&wanted, ".");

sub wanted
{
    if (-f $_)
    {
        # for the files we are interested in call edit_file().
        edit_file($_);
    }
}

sub edit_file
{
    my ($filename) = @_;

    # you can re-create the one-liner above by localizing @ARGV as the list of
    # files the <> will process, and localizing $^I as the name of the backup file.
    local (@ARGV) = ($filename);
    local($^I) = '.bak';

    while (<>)
    {
        s/original string/new string/g;
    }
    continue
    {
        print;
    }
}




bulk