Здесь есть два уровня интерпретации: shell и sed.
В оболочке все между одинарными кавычками интерпретируется буквально, за исключением самих одинарных кавычек. Вы можете эффективно заключить одинарную кавычку в одинарные кавычки '\''(закрыть одинарную кавычку, одну буквальную одинарную кавычку, открыть одинарную кавычку).
Sed использует основные регулярные выражения . В BRE, чтобы их можно было трактовать буквально, символы $.*[\^должны быть заключены в кавычки, перед ними стоит обратная косая черта, за исключением внутренних наборов символов ( […]). Буквы, цифры и (){}+?|не должны быть заключены в кавычки (вы можете избежать цитирования некоторых из них в некоторых реализациях). Последовательности \(, \), \n, и в некоторых реализациях \{, \}, \+, \?, \|и другой обратный слэш + буквенно - цифровые имеют особое значение. Вы можете избежать неприятностей $^в некоторых позициях в некоторых реализациях.
Кроме того, вам нужен обратный слеш перед тем /, как он появится в регулярном выражении вне выражений в скобках. Вы можете выбрать альтернативный символ в качестве разделителя, написав, например, s~/dir~/replacement~или \~/dir~p; перед разделителем вам понадобится обратный слеш, если вы хотите включить его в BRE. Если вы выбираете символ, имеющий особое значение в BRE, и хотите включить его буквально, вам понадобится три обратных слеша; Я не рекомендую это, поскольку это может вести себя по-другому в некоторых реализациях.
В двух словах, для sed 's/…/…/':
- Напишите регулярное выражение между одинарными кавычками.
- Используйте,
'\''чтобы закончить с одинарной кавычкой в регулярном выражении.
- Поставьте обратную косую черту перед
$.*/[\]^и только этими символами (но не внутри скобочных выражений). (Технически вы не должны ставить обратную косую черту раньше, ]но я не знаю реализации, которая обрабатывает ]и \]отличается от скобочных выражений.)
- Внутри выражения в скобках,
-чтобы его можно было трактовать буквально, убедитесь, что оно первое или последнее ( [abc-]или [-abc]нет [a-bc]).
- Внутри выражения в скобках,
^чтобы его можно было трактовать буквально, убедитесь, что оно не первое (используйте [abc^], а не [^abc]).
- Чтобы включить
]в список символов, совпадающих с выражением в скобках, сделайте его первым символом (или первым после ^для отрицательного набора): []abc]или [^]abc](не [abc]]ни[abc\]] ).
В тексте замены:
&и \должны быть заключены в кавычки, перед ними стоит обратная косая черта, как и разделитель (обычно /) и символы новой строки.
\сопровождаемая цифра имеет особое значение. \сопровождаемая буквой имеет специальное значение (специальные символы) в некоторых реализациях, и \после нее следуют некоторые другие символьные средства \cили в cзависимости от реализации.
- С одинарными кавычками вокруг аргумента (
sed 's/…/…/'), используйте, '\''чтобы поместить одинарную кавычку в текст замены.
Если регулярное выражение или текст замены происходит из переменной оболочки, помните, что
- Регулярное выражение - это BRE, а не буквальная строка.
- В регулярном выражении символ новой строки должен быть выражен как
\n(который никогда не будет совпадать, если у вас нет другого sedкода, добавляющего символы новой строки в пространство шаблона). Но обратите внимание, что он не будет работать внутри скобочных выражений с некоторыми sedреализациями.
- В тексте замены
&, \и новые строки должны быть в кавычках.
- Разделитель должен быть заключен в кавычки (но не внутри скобочных выражений).
- Используйте двойные кавычки для интерполяции:
sed -e "s/$BRE/$REPL/".
function sedPath { path=$((echo $1|sed -r 's/([\$\.\*\/\[\\^])/\\\1/g'|sed 's/[]]/\[]]/g')>&1) } #Escape path for use with sed