Найти и заменить текст символами косой черты

Итак, я посмотрел на Stackoverflow и понял, что поиск и замена текста работает примерно так:

perl -pi -w -e 's/www.example.com/www.pressbin.com/g;' *.html

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

perl -pi -w -e 's/path/to/file/new/path/to/file/g;' *.html

person HZN    schedule 02.09.2012    source источник
comment
Какое это имеет отношение к ssh?   -  person Paul R    schedule 02.09.2012


Ответы (2)


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

  • Символы в \w (так что s xfooxbarx совпадает с s/foo/bar/) и
  • Вопросительные знаки ? (неявно активирует поведение совпадения только один раз, устарело) и
  • одинарные кавычки '...' (повороты переменной интерполяции)

необходимо избегать. Я предпочитаю фигурные скобки:

perl -pi -w -e 's{path/to/file}{new/path/to/file}g;' *.html

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

perl -pi -w -e 's/path\/to\/file/new\/path\/to\/file/g;' *.html

но это откровенно некрасиво.

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

$string =~ s {foo}
             {bar}g;

Еще одна интересная опция регулярного выражения в этом контексте — функция quotemeta. Если ваше поисковое выражение содержит много символов, которые обычно интерпретируются как имеющие особое значение, мы можем заключить эту строку в \Q...\E. Так

m{\Qx*+\E}

соответствует точной строке x*+, даже если включены такие символы, как *, '+' или | и т. д.

person amon    schedule 02.09.2012

Вы можете использовать другие символы, кроме '/', для указания шаблонов. Например:

perl -pi -w -e 's,path/to/file,new/path/to/file,g;' *.html
person Stephane Rouberol    schedule 02.09.2012