2014-02-06 3 views
0

В настоящий момент этот код заменяет все вхождения моей строки соответствия моей заменяющей строкой, но только для файла, который я указываю в командной строке. Есть ли способ изменить это так, чтобы все .txt-файлы, например, в том же каталоге (указанный мной каталог) обрабатывались без необходимости запускать это 100 раз в отдельных файлах?Perl - поиск и замена по нескольким строкам по нескольким файлам в указанном каталоге

#!/usr/bin/perl 

use warnings; 

my $filename = $ARGV[0]; 
open(INFILE, "<", $filename) or die "Cannot open $ARGV[0]"; 
my(@fcont) = <INFILE>; 
close INFILE; 

open(FOUT,">$filename") || die("Cannot Open File"); 
foreach $line (@fcont) { 
$line =~ s/\<br\/\>\n([[:space:]][[:space:]][[:space:]][[:space:]][A-Z])/\n$1/gm; 
print FOUT $line; 
} 
close INFILE; 

Я также попытался это:

perl -p0007i -e 's/\<br\/\>\n([[:space:]][[:space:]][[:space:]][[:space:]][A-Z])/\n$1/m' *.txt 

Но заметил, что изменяет только первое вхождение подходящего шаблона и игнорирует все остальное в файле.

Я также попытался это, но он не работает в том смысле, что он просто создает пустой файл:

use v5.14; 
use strict; 
use warnings; 
use DBI; 

my $source_dir = "C:/Testing2"; 

# Store the handle in a variable. 
opendir my $dirh, $source_dir or die "Unable to open directory: $!"; 
my @files = grep /\.txt$/i, readdir $dirh; 
closedir $dirh; 

# Stop script if there aren't any files in the list 
die "No files found in $source_dir" unless @files; 

foreach my $file (@files) { 
    say "Processing $source_dir/$file"; 
    open my $in, '<', "$source_dir/$file" or die "Unable to open $source_dir/$file: $!\n"; 
    open(FOUT,">$source_dir/$file") || die("Cannot Open File"); 

    foreach my $line (@files) { 
     $line =~ s/\<br\/\>\n([[:space:]][[:space:]][[:space:]][[:space:]][A-Z])/\n$1/gm; 
     print FOUT $line; 
    } 
    close $in; 
} 
say "Status: Processing of complete"; 

Просто интересно, что я упускаю из моего кода выше? Благодарю.

ответ

0

Вы можете попробовать следующее:

opendir(DIR,"your_directory"); 
my @all_files = readdir(DIR); 
closedir(DIR); 

for (@all_files) ..... 
+0

Спасибо. Как включить мой поиск и заменить код в цикле for (@all_files)? – user1236443

+0

user1418706 Вы можете подробнее рассказать о том, как я должен структурировать свой код? – user1236443

Смежные вопросы