| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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); |
| Автор: 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 для профессиональных программистов. Регулярные выражения", есть ещё авторские экземпляры. А на стр. http://www.cronc.com/ru/ есть мои статейки по Perl re, в частности, как сконструировать пример re для проверки правильности арифметич. выражения с неограниченной вложенностью скобок. Аналогично можно конструировать re для всего, что подчиняется грамматике LL(1). |