Perl regex: заменить все обратные косые черты двойными - PullRequest
2 голосов
/ 10 июня 2009

В наборе больших файлов мне нужно заменить все вхождения "\" на "\\". Я хотел бы использовать Perl для этой цели. Прямо сейчас у меня есть следующее:

perl -spi.bak -e '/s/\\/\\\\/gm' inputFile

Эта команда была предложенной для меня, но она не приводит к изменению inputFile (кроме обновленной метки времени). Думая, что проблема может быть в том, что "\" не были окружены пробелами, я попытался

perl -spi.bak -e '/s/.\\./\\\\/gm' inputFile

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

perl -spi.bak -e '/s/.\\./\\\\/gm;' inputFile

Это также не имеет никакого эффекта. Я знаю, что мой файл содержит "\", например, в следующей строке:

("C:\WINDOWS\system32\iac25_32.ax","Indeo audio)

Я не уверен, есть ли проблема с регулярным выражением или что-то не так с тем, как я вызываю Perl. У меня есть базовое понимание регулярных выражений, но я абсолютный новичок в том, что касается Perl.

Здесь что-то явно не так? Одна вещь, которую я заметил, состоит в том, что команда возвращается довольно быстро, несмотря на то, что размер inputFile составляет ~ 10 МБ.

Ответы [ 6 ]

8 голосов
/ 10 июня 2009

Сложной частью обработки обратной косой черты в командной строке является знание того, сколько процессов будет манипулировать командной строкой, и каковы их правила цитирования.

В Unix под любой оболочкой первая отображаемая командная строка будет работать.

Вы, кажется, находитесь в Windows, и там у вас есть DOS-команда 'shell' для работы.

Я бы поместил замену в файл и передал ее в Perl:

#!/bin/perl -spi.bak
s/\\/\\\\/g;

Это должно сработать - сохраните как 'subber.pl' и запустите:

perl subber.pl file1 ...
1 голос
/ 10 июня 2009

это

s/\\/\\\\/g 

у меня работает

У вас есть отступник / перед флагом замещения в начале регулярного выражения

не используйте

.\\.

в противном случае он будет уничтожать все, что находится до и после \ в файле

1 голос
/ 10 июня 2009
perl -pi -e 's/\\/\\\\/g' inputfile

заменит их все в одном файле

1 голос
/ 10 июня 2009

Как насчет этого, он должен заменить все \ с двумя \ s.

s/\\/\\\\/g
0 голосов
/ 10 июня 2009

Вы, кажется, находитесь в Windows, и там у вас есть команда DOS «Оболочка», чтобы иметь дело.

Надеюсь, я не расщепляю волосы, но Windows давно не поставляется с DOS. Я думаю, что ME (около 1999/2000) была последней версией, которая все еще шла с DOS или была построена на DOS. Оболочка «команда» управляется cmd.exe начиная с XP (своего рода симуляция DOS), но последствия запуска однострочного perl в командной оболочке могут быть такими же, как и запуск их в оболочке DOS. Может быть, кто-то может это проверить.

0 голосов
/ 10 июня 2009
perl -spi.bak -e 's/.\\./\\\\/gm;' inputFile

может быть? Почему вы набрали этот ведущий /?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...