Попередження : це не враховує нових рядків. Для більш поглибленої відповіді див . Замість цього питання SO . (Спасибі, Ед Мортон та Ніклас Пітер)
Зауважте, що уникнути всього - це погана ідея. SED потреба багато символів , щоб бути екрановані , щоб отримати свій особливий сенс. Наприклад, якщо уникнути цифри в рядку заміни, вона перетвориться на зворотну референцію.
Як сказав Бен Бланк, у рядку заміни потрібно уникнути лише трьох символів (втечі самі, косої риски для кінця оператора та & для заміни всіх):
ESCAPED_REPLACE=$(printf '%s\n' "$REPLACE" | sed -e 's/[\/&]/\\&/g')
# Now you can use ESCAPED_REPLACE in the original sed statement
sed "s/KEYWORD/$ESCAPED_REPLACE/g"
Якщо вам коли-небудь знадобиться вийти з KEYWORD
рядка, вам потрібен наступний:
sed -e 's/[]\/$*.^[]/\\&/g'
І можуть бути використані:
KEYWORD="The Keyword You Need";
ESCAPED_KEYWORD=$(printf '%s\n' "$KEYWORD" | sed -e 's/[]\/$*.^[]/\\&/g');
# Now you can use it inside the original sed statement to replace text
sed "s/$ESCAPED_KEYWORD/$ESCAPED_REPLACE/g"
Пам'ятайте, що якщо ви використовуєте символ, який не /
є роздільником, вам потрібно замінити косу рису в виразах, вищих над символом, який ви використовуєте. Дивіться коментар PeterJCLaw для пояснення.
Відредаговано: Через деякі кутові випадки, які раніше не обліковувалися, команди вище були змінені кілька разів. Перевірте історію редагування для отримання детальної інформації.