Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Регулярные выражения > Замена слова в файле


Автор: kirillekb 14.7.2014, 08:33
Здравствуйте уважаемые форумчане!
В Perl я новичок и думаю, что моя задача решается в два действия.
Есть файл temp.txt в котором необходимо заменить слово wall на wall1.
Попробовал самостоятельно написать скрипт, но что то замены не происходит
Заранее благодарен за любую помощь!
Код:

$file = "temp.txt";

open (INPUT, $file) || die "$!";

while ($line = <INPUT>) {
if ($line =~ s/wall/wall1/g) {


print INPUT $line


}
}

close (INPUT);

Автор: Bulat 14.7.2014, 10:13
А что-нибудь вообще выдает, может сообщения об ошибках??

Лично я сделал бы - считывал с одного файла, а записывал в другой, потом подменял файлы

Автор: kirillekb 14.7.2014, 11:27
Спасибо большое за ответ!

Никаких ошибок не выдает. 
Попробовал считывание с одного файла и запись в другой, все получается. Мне вообще в конечном итоге необходимо, чтобы исходный файл "temp_prof1.csv" копировался 122 раза и в каждом файле подменялось имя с wall1, как в исходном файле на wall2..wall122. Пока что получается скопировать один файл и заменить в нем имя с wall1 на wall2. Наверное цикл надо писать? Если надо, то как это лучше сделать?

Вот новый код

$input = "temp_prof1.csv";
open (INPUT, $input) || die "$!";

$output = "temp_prof2.csv";
open (OUTPUT, ">>$output") || die "$!";

     while ($line = <INPUT>) {
      
      $line =~ s/wall1/wall2/; 
      
       
       print OUTPUT $line;
      }

close (INPUT);
close (OUTPUT);

Автор: Bulat 14.7.2014, 12:08
Цитата(kirillekb @  14.7.2014,  11:27 Найти цитируемый пост)
Наверное цикл надо писать? Если надо, то как это лучше сделать?

лучше так - чтобы работало  smile 
погугли на тему циклы в перл, там все относительно просто. Если будут какие-то конкретные вопросы - пиши.  smile 

Автор: kirillekb 14.7.2014, 13:05
Разобрался 

Код

$input = "temp_prof1.csv";

for ($i=2; $i <= 122; $i++) {

open (INPUT, $input) || die "$!"; 

$output = "temp_prof$i.csv";
open (OUTPUT, ">$output") || die "$!";
     while ($line = <INPUT>) {    
     $line =~ s/wall1/wall$i/;   
     print OUTPUT "$line";   
     }
close OUTPUT;
close INPUT;
}

Автор: MasterOfRegex 20.3.2015, 16:31
Даю свой скриптик для обработки всех файлов в данном каталоге. В данном примере он расставляет номера перед строками. Можете переделать под свои нужды (для замены чего-то, отредактировав оператор s///):

#!/usr/bin/perl -w
use strict;
use bytes;
use locale;

# Обработка всех файлов в данном каталоге, чьи имена соотв. $namere.
my $namere=qr/^filename.txt$/;
my $fcount=0;
my $substnum=0;

undef $/;
opendir DIR,'.';
foreach (readdir DIR)
 { &process_file($_) if $_ ne '.' && $_ ne '..' && -f $_ && $_ =~ $namere;
 }
closedir DIR;
print "$fcount files processed,\n$substnum substitutions made.\n";

sub process_file($)
{ print "$_: ";
  open F,"+<$_" or die "Can not open $_\n";
  binmode F;
  $_=<F>;
  my $flen=length $_;
  seek F,0,0;
  # Здесь операторы замены в $_
#  $substnum+=s///g;
  # Расставить номера строк
  my $i=1;
  $substnum+=s/^/$i++.'. '/mge;

  print F $_;
  die "Can not truncate!\n" if $flen > length $_ and !truncate(F,length($_));
  close F;
  $fcount++;
  print "OK\n";
}

Кстати, я автор книжки "Perl для профессиональных программистов. Регулярные выражения", есть ещё авторские экземпляры. smile

А на стр. http://www.cronc.com/ru/ есть мои статейки по Perl re, в частности, как сконструировать пример re для проверки правильности арифметич. выражения с неограниченной вложенностью скобок. Аналогично можно конструировать re для всего, что подчиняется грамматике LL(1). smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)