Здесь есть два уровня интерпретации: 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