Заменить многострочную строку многострочной строкой без экранирования вручную

cdn-fastly.deb.debian.orgи deb.debian.orgявляются частью одной и той же службы , но это не одно и то же. Последний служит двум целям:его записи DNS содержат записи SRV, которые позволяют aptнаходить зеркала (начиная с Stretch ), и на нем размещен веб-сервер, который будет перенаправлять aptна соответствующий хост если необходимо. Первый — это CDN Fastly для зеркальной сети Debian. Конечный результат использования любого из них в sources.listодинаков; использование deb.debian.orgтребует дополнительного шага, но, возможно, является более надежным -доказательством в будущем.

Эта конкретная услуга спонсируется Fastly и Amazon CloudFront. Все зеркала Debian так или иначе спонсируются; список спонсоров общедоступен . Все службы debian.orgявляются официальными службами Debian.

1
07.12.2019, 17:30
2 ответа
perl -i -p0e 's/`cat before.txt`/`cat after.txt`/se' text.txt

Здесь у вас есть обратные кавычки внутри одинарных -кавычек, поэтому они не обрабатываются оболочкой, но Perl видит их как -. Тогда снова,Perl также поддерживает обратные апострофы как форму цитирования, но это не работает внутри s///.

Наличие многострочного шаблона -не является проблемой, если вы используете -0или -0777в командной строке Perl.(-0будет иметь отдельные строки с символом NUL, которого не будет в текстовом файле, а -0777будет читать весь файл за один раз.)

Вы могли бы сделать это с помощью двойных -кавычек, но это расширило бы содержимое файлов непосредственно в сценарии Perl, а любые специальные символы были бы восприняты как часть сценария. Одна косая черта заканчивала бы оператор s///и вызывала проблемы.

Вместо этого попросите Perl прочитать файлы:

perl -i -0 -pe '$b = `cat before.txt`; $a = `cat after.txt`; s/$b/$a/s' text.txt

Здесь содержимое before.txtпо-прежнему будет восприниматься как регулярное выражение. Если вы хотите остановить это, используйте вместо этого s/\Q$b\E/$a/s.

Я не думаю, что вы хотите, чтобы флаг eбыл равен s///, это сделало бы замену воспринятой как выражение Perl (, что опять же действительно имеет значение только в том случае, если у вас есть оболочка, расширяющая содержимое файла до Командная строка Perl ).


В вашем более позднем примере у вас есть some text.\nв text.txtи text\nв before.txt, где \nпредставляет новую строку, как обычно. Когда файлы загружаются в Perl, они воспринимаются как -, поэтому считается последняя новая строка в before.txt. В другом файле есть точка перед новой строкой, в другом нет, поэтому они не совпадают.

Вы можете удалить возможный символ новой строки в конце с помощью chomp $b;после загрузки файлов. Вы можете удалить возможный завершающий символ новой строки, например, с помощью.$b =~ s/\n$//;:

$ perl -0 -pe '$b = `cat before.txt`; $a = `cat after.txt`; $b =~ s/\n$//; $a =~ s/\n$//; s/$b/$a/s' text.txt
Here is 
some whatever.
4
27.01.2020, 23:17

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

Также обратные кавычки не -предпочтительны по нескольким причинам, поэтому здесь я изменил их на$( )

perl -i -p0e "s/$(cat before.txt)/$(cat after.txt)/se" text.txt

NB :Я просто решаю вашу проблему с цитированием, я не даю обещаний, что ваша команда сделает то, что вы намереваетесь.

0
27.01.2020, 23:17

Теги

Похожие вопросы