regex заменить в файле

Я пытаюсь сделать замену определенного набора символов в файле в Perl, но он не работает, вот мой код.

my $file = shift;
open(FILE, "$file") or die "File not found";
while (){
   $data .=$_
}
$data =~ s/[^A-CEGHJ-PR-TW-Z]{1}[A-CEGHJ-NPR-TW-Z]{1}\s?[0-9]{2}\s?[0-9]{2}\s[0-9]{2}\s?[A-DEM]{0,1}$/XX012345X/g;

Я знаю, что мой подход к шаблону работает для поиска набора символов, я не совсем уверен, что замена работает. Однако моя главная проблема - это код Perl. После его запуска файл остается нетронутым.

Пример файла.

AB123456C Ab12345678 DG657465 GH123456FG
0
nl ja de
Можете ли вы отправить образец файла в свой вопрос?
добавлено автор Stephan, источник
«После того, как я запустил этот файл, файл остается нетронутым». Ответы. Сделаны изменения. Мои намерения ясны в первой строке, но для ясности я пытаюсь открыть файл, замените regex на весь файл. благодаря
добавлено автор James Mclaren, источник
Возможно, вы должны упомянуть, что именно вы надеетесь, что ваш код будет делать. Этот код ничего не делает, если вы не печатаете $ data . Кроме того, в первой части вашего регулярного выражения у вас есть Z {1} , который выглядит как опечатка.
добавлено автор TLP, источник
О, а также «это не работает» - это ужасно bad способ описания вашей проблемы. Он ничего не говорит, не так ли.
добавлено автор TLP, источник
1. Вы не пишете в этот файл, вы просто читаете данные из него, поэтому почему файл должен быть изменен? 2. В вашем регулярном выражении используются привязки для соответствия началу и концу строки, вы читаете несколько строк, возможно, вам нужен модификатор m , чтобы изменить это поведение?
добавлено автор stema, источник

2 ответы

Код не изменяет файл, потому что вы его не рассказываете. Вы открываете файл для чтения, а не для записи, плюс ничего не печатаете.

Если вам нужен быстрый способ справиться с этим, просто поместите подзаголовок регулярного выражения в файл и используйте его в качестве исходного файла. Как это:

Содержимое regex.pl:

s/[^A-CEGHJ-PR-TW-Z]{1}[A-CEGHJ-NPR-TW-Z]{1}\s?[0-9]{2}\s?[0-9]{2}\s[0-9]{2}\s?[A-DEM]{0,1}$/XX012345X/g;

Один лайнер:

perl -p regex.pl inputfile.txt > output.txt

Таким образом, вы можете быстро проверить выход. Вы также можете подключиться к команде пейджера или вообще не использовать.

2
добавлено
Хорошо, спасибо за это. Мне нравится идея сделать это на одной линии. Я слегка модифицирован регулярным выражением. В настоящее время /^ [A-CEGHJ-PR-TW-Z] {1} [A-CEGHJ-NPR-TW-Z] {1} [0-9] {6} [A-DFM] { 0 & zwnj;, 1} $/, который отлично подходит для AB123456C при сопоставлении веб-сайтов тегов регулярных выражений. Когда я меняю его на замену, добавляя /XX01234X/g , он не работает. Есть идеи?
добавлено автор James Mclaren, источник
Теперь это похоже на работу после восстановления кода ^ и $ . В любом случае, я могу избежать пересылки в другой файл и просто изменить оригинал?
добавлено автор James Mclaren, источник
Да, вы можете использовать переключатель -i , который будет редактировать на месте. Рекомендуется использовать резервные копии, например. -i.bak (резервная копия сохраняется в file.txt.bak ). Итак perl -pi.bak regex.pl input.txt
добавлено автор TLP, источник
Обычно я не рекомендую переключатель -i для новичков, потому что это несколько опасно. Изменения необратимы, и даже если вы используете резервные копии, вы можете перезаписать оригинал, дважды запустив скрипт ( file.txt.bak будет перезаписан).
добавлено автор TLP, источник

Файл, который вы открываете, доступен только для чтения. Поэтому вам нужно открыть временный второй файл ( Файл :: Temp ), где ваш напишите переменную $ data, закройте ее, удалите первый файл ( отмените связь ) и < a href = "http://perldoc.perl.org/functions/rename.html" rel = "nofollow noreferrer"> переименовать временный файл в нужное имя.

Этот запрос SO может быть полезно.

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

open my $fh, "<", $filename or die "Cannot open file $filename"

См. Также этот вопрос SO . Избегайте использования глобальных дескрипторов файлов типа global.

0
добавлено
Modern::Perl
Modern::Perl
362 участник(ов)

Пожалуйста, представьтесь при добавлении в группу. Это необходимо во избежание спам-ботов. Ваше первое сообщение не должно быть ссылкой или репостом. Мы всегда рады нестандартным вопросам.

use Perl or die;
use Perl or die;
164 участник(ов)

Группа о языке Perl и обо всём что с ним связано.

pro.perl
pro.perl
22 участник(ов)

Язык программирования Perl