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

echo "a" | sed "s/a/home/books/examples/file/g"

Я попытался избежать замены части команды sed, заключив ее в \Q и \E, как таковой:

echo "a" | sed "s/a/\Qhome/books/examples/file\E/g"

Я также пытался передать флаг -r в обеих командах, чтобы включить расширенное регулярное выражение, но я не думаю, что это проблема.

РЕДАКТИРОВАТЬ: я считаю, что проблема в том, что sed интерпретирует некоторые символы в пути как специальные символы регулярного выражения, поэтому я хочу избежать их, но не могу избежать их один за другим. Способ выхода из последовательности, описанный мной выше, не сработал.

Я знаю, что можно экранировать отдельные символы, но это не работает для меня, поскольку доступ ко многим из этих строк осуществляется через переменные, поэтому для такой замены требуется еще одна аналогичная команда sed сама по себе!

Я намерен выполнить эту команду внутри сценария оболочки.

-1
Lara 14 Июл 2020 в 19:17

1 ответ

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

s=${s//'\'/'\\'}
s=${s//'/'/'\/'}
sed "s/$s/replacement/g"

В bash, но перейти на Perl гораздо проще. В Perl вы можете использовать синтаксис \Q...\E для заключения подстроки в кавычки:

perl -pe 's/\Q$ARGV[1]\E/replacement/g' "$s"
0
choroba 14 Июл 2020 в 19:34