Как заменить строку, которая имеет escape-последовательность внутри файла, используя Perl? - PullRequest
5 голосов
/ 21 декабря 2010

как заменить строку внутри файла с помощью perl?

perl -pi -e 's/Arun/Brun/g' *

у меня это работало нормально

но когда я попытался изменить class/students/a на class1/students1/B, выдается ошибка, как решить эту проблему .. я пытался добавить косую черту (\) перед каждым (/), но это не помогло

perl -pi -e 's/class/students/a/class1/students1/B/g' *

Ответы [ 3 ]

12 голосов
/ 21 декабря 2010

Вы используете / в качестве разделителя регулярных выражений.
Даже в вашем шаблоне и есть замена . Вы должны как-то убедиться, что эти / не должны рассматриваться как разделитель.

У вас есть два варианта:

  1. Escape / в вашем паттерне и замена как:

    perl -pi -e 's/class\/students\/a/class1\/students1\/B/g' *
    
  2. Или используйте другой разделитель:

    perl -pi -e 's#class/students/a#class1/students1/B#g' *
    

Метод 2 предпочтителен, так как он поддерживает ваше регулярное выражение short и clean .

8 голосов
/ 21 декабря 2010

Попробуйте perl -pi -e 's{class/students/a}{class1/students1/B}g' *

С perldoc perlop :

Любой разделитель без пробелов может заменить косую черту.Добавьте пробел после s при использовании символа, разрешенного в идентификаторах.(...) Если ШАБЛОН ограничен кавычками, то ЗАМЕНА имеет свою собственную пару кавычек, которые могут быть или не быть заключенными в кавычки, например, s (foo) (bar) или s / bar /.

0 голосов
/ 11 июня 2014

Спасибо, perldoc perlop:

Моя проблема изменилась в Oracle Home, которую вы решили решить по вашей команде. я сделал еще один трюк, чтобы заменить его на переменную оболочки.

export ORACLE_HOME=/oracle/product/11.2.0.3/db_1

perl -pi -e 's{REPLACEWITHORACLEHOME}{'$ORACLE_HOME'}g' filename

более скриптовый способ:

for y in `ls`;do perl -pi -e 's{REPLACEWITHORACLEHOME}{'$ORACLE_HOME'}g' $y;done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...