Как заменить строку в существующем файле в Perl? - PullRequest
47 голосов
/ 09 августа 2011

Я хочу заменить слово «синий» на «красный» во всех текстовых файлах с именами 1_classification.dat, 2_classification.dat и так далее.Я хочу отредактировать тот же файл, поэтому я попробовал этот код, но он не работает.Куда я иду не так?

@files=glob("*_classification.dat");
foreach my $file (@files)
{
    open(IN,$file) or die $!;
    <IN>;
    while(<IN>)
    {
       $_='~s/blue/red/g';
       print IN $file;
    }

   close(IN)
}

Ответы [ 3 ]

120 голосов
/ 09 августа 2011

Что-то не так с однострочником?

$ perl -pi.bak -e 's/blue/red/g' *_classification.dat

Пояснение

  • -p обрабатывает, затем печатает <> строкупо линии
  • -i активирует редактирование на месте.Для резервного копирования файлов используется расширение .bak
  • Подстановка регулярного выражения действует на неявную переменную, которая является содержимым файла, строка за строкой
11 голосов
/ 06 декабря 2017

Ни один из существующих ответов здесь не предоставил полный пример того, как сделать это из скрипта (не одной строки).Вот что я сделал:

rename($file, $file.'.bak');
open(IN, '<'.$file.'.bak') or die $!;
open(OUT, '>'.$file) or die $!;
while(<IN>)
{
    $_ =~ s/blue/red/g;
    print OUT $_;
}
close(IN);
close(OUT);
10 голосов
/ 09 августа 2011

$_='~s/blue/red/g';

Э-э, что ??

Просто

s/blue/red/g;

или, если вы настаиваете на использовании переменной (котораяне требуется при использовании $ _, но я просто хочу показать правильный синтаксис):

$_ =~ s/blue/red/g;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...