Модераторы: ginnie, JackYF
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Замена слова в файле 
:(
    Опции темы
kirillekb
Дата 14.7.2014, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 14.7.2014

Репутация: нет
Всего: нет



Здравствуйте уважаемые форумчане!
В 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);
PM MAIL   Вверх
Bulat
Дата 14.7.2014, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1636
Регистрация: 22.3.2006
Где: за углом

Репутация: нет
Всего: 57



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

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


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW ICQ   Вверх
kirillekb
Дата 14.7.2014, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 14.7.2014

Репутация: нет
Всего: нет



Спасибо большое за ответ!

Никаких ошибок не выдает. 
Попробовал считывание с одного файла и запись в другой, все получается. Мне вообще в конечном итоге необходимо, чтобы исходный файл "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);
PM MAIL   Вверх
Bulat
Дата 14.7.2014, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1636
Регистрация: 22.3.2006
Где: за углом

Репутация: нет
Всего: 57



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

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


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW ICQ   Вверх
kirillekb
Дата 14.7.2014, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 14.7.2014

Репутация: нет
Всего: нет



Разобрался 

Код

$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;
}

PM MAIL   Вверх
MasterOfRegex
Дата 20.3.2015, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 25.10.2010

Репутация: нет
Всего: нет



Даю свой скриптик для обработки всех файлов в данном каталоге. В данном примере он расставляет номера перед строками. Можете переделать под свои нужды (для замены чего-то, отредактировав оператор 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
PM MAIL   Вверх
Google
  Дата 17.11.2019, 22:51 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема »


 




[ Время генерации скрипта: 0.0659 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.