Как передать в качестве шаблона переменную, содержащую косую черту sed
?
Например, если у меня есть следующая переменная:
var="/Users/Documents/name/file"
Я хочу передать это sed
так:
sed "s/$var/replace/g" "$file"
Однако я получаю ошибки. Как я могу обойти проблему?
$var
Чистый ответ bash: используйте расширение параметра, чтобы избежать косой черты в переменной:
источник
${parameter/pattern/string}
. Итак, в этом случае параметрvar
, шаблон/\/
и строка\\/
. Все экземпляры шаблона заменяются, потому что шаблон начинается с символа/
.Другой способ сделать это, хотя и уродливее, чем ответ анубхавы, - это избежать всех обратных косых черт с
var
помощью другойsed
команды:тогда это будет работать:
источник
Использование
/
в sed в качестве разделителя приведет к конфликту с косой чертой в переменной при замене, и в результате вы получите ошибку. Один из способов обойти это - использовать другой разделитель, уникальный для любых символов, содержащихся в этой переменной.вы можете использовать символ октоторпа, который подходит к случаю (или любой другой символ, который не является
/
простым для использования)или
это подходит, когда переменная не содержит пробелов
или
Разумнее использовать приведенное выше, поскольку мы заинтересованы в замене всего, что находится в этой переменной, только по сравнению с двойным заключением в кавычки всей команды, что может заставить оболочку интерпретировать любой символ, который может считаться специальным символом оболочки для оболочки.
источник
$var
содержит~
, вам, очевидно, нужно выбрать другой разделитель. "Неисправленная" ошибка звучит так, как будто ваша$var
содержит новую строку; вы могли бы исправить это, экранируя каждую новую строку в значении с помощью обратной косой черты, но я не думаю, что это полностью переносимо. Это по большому счету не связано с проблемой косой черты в значении.sed -i "s~blah~$var~g" file
с кавычками только вокруг самогоsed
сценария.Это старый вопрос, но ни один из ответов здесь не рассматривает операции, кроме как
s/from/to/
более подробно.Общая форма
sed
заявления:где адрес может быть диапазоном регулярных выражений или диапазоном номеров строк (или пустым, и в этом случае действие применяется к каждой строке ввода). Так например
удалит строки с 1 по 4 ( адрес - это диапазон номеров строк,
1,4
а действие - командаd
удаления); изаменит первое вхождение
foo
сbar
любой линией между первым матчем на регулярном выраженииick
и в конце файла ( адрес является диапазоном/ick/,$
и действием являетсяs
командой заменыs/foo/bar/
).В этом контексте, если вы
ick
пришли из переменной, вы могли бы сделать(обратите внимание на использование двойных кавычек вместо одинарных, чтобы оболочка могла интерполировать переменную, и необходимость заключать буквальный знак доллара в двойные кавычки), но если переменная содержит косую черту, вы получите синтаксическую ошибку. (Оболочка расширяет переменную, а затем передает полученную строку в
sed
; поэтомуsed
видит только буквальный текст - он не имеет понятия о переменных оболочки.)Лекарство - использовать другой разделитель (где, очевидно, вам нужно иметь возможность использовать символ, который не может встречаться в значении переменной), но в отличие от этого
s%foo%bar%
случая вам также понадобится обратная косая черта перед разделителем, если вы хотите использовать другой разделитель, чем по умолчанию/
:(внутри одинарных кавычек, очевидно, достаточно одной обратной косой черты); или вы можете отдельно убрать каждую косую черту в значении. Этот конкретный синтаксис предназначен только для Bash:
или если вы используете другую оболочку, попробуйте
Для ясности, если бы она
$variable
содержала строку,1/2
то приведенные выше команды были бы эквивалентныв первом случае и
во-вторых.
источник
Используйте Perl, где переменные - это первоклассные граждане, а не просто расширяющие макросы:
-p
читает строку за строкой и печатает строку после обработки\Q
заключает в кавычки все метасимволы в следующей строке (не требуется для значения, представленного здесь, но необходимо, если значение содержит[
или некоторые другие значения, специально предназначенные для регулярных выражений)источник