Как экранировать (escape) строки в шелле?

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
rm_
Сообщения: 3340
Статус: It's the GNU Age
ОС: Debian

Как экранировать (escape) строки в шелле?

Сообщение rm_ »

Имеем следующую проблему:

Код: Выделить всё

X=http://www.example.com/; echo "blah" | sed "s/^/$X/"
sed: -e expression #1, char 11: unknown option to `s'

Как правильно проэскейпить (+обезвредить в ней возможные injection'ы) переменную, вставляемую в регэксп к sed'у?
Нужно сделать это автоматически, т.к. в отличие от этого простого примера, $X берётся из вводимого пользователем значения, и может быть равна вообще чему угодно.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: Как экранировать (escape) строки в шелле?

Сообщение /dev/random »

Нужно экранировать (это слово переводится так) символы "\", "/", "&"; а также заменить перевод строки на "\n". Последнее верно для gnu sed, но неверно для некоторых других версий. Символ "\" нужно экранировать первым, чтобы случайно не заэкранировать те бакслэши, которые мы добавим сами ))
Спасибо сказали:
Аватара пользователя
rm_
Сообщения: 3340
Статус: It's the GNU Age
ОС: Debian

Re: Как экранировать (escape) строки в шелле?

Сообщение rm_ »

/dev/random писал(а):
24.03.2010 11:13
Нужно экранировать (это слово переводится так) символы "\", "/", "&"; а также заменить перевод строки на "\n". Последнее верно для gnu sed, но неверно для некоторых других версий.

Это в общем понятно, но чем и как именно это сделать?
С помощью sed не получится - ведь для этого, неэкранированную придётся подставить в параметр sed, и собственно приходим к тому, с чего и начали.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: Как экранировать (escape) строки в шелле?

Сообщение /dev/random »

rm_ писал(а):
24.03.2010 11:16
С помощью sed не получится - ведь для этого, неэкранированную придётся подставить в параметр sed, и собственно приходим к тому, с чего и начали.

Зачем? Её не подставлять в sed надо, а передавать через пайп. Из echo.
Спасибо сказали:
Аватара пользователя
rm_
Сообщения: 3340
Статус: It's the GNU Age
ОС: Debian

Re: Как экранировать (escape) строки в шелле?

Сообщение rm_ »

/dev/random Точно.

Тут ещё вот такой вариант подсказали (поправил)

Код: Выделить всё

A="http://example.com/";
A=`echo $A | tr "|" " "`
echo blah | sed "s|^|$A|"

Вместо пайпа можно взять какой-нибудь другой, заведомо ненужный в обрабатываемых строках символ.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: Как экранировать (escape) строки в шелле?

Сообщение /dev/random »

rm_ писал(а):
24.03.2010 11:23
Тут ещё вот такой вариант подсказали
A="http://example.com/"; echo blah | tr "|" " " | sed "s|^|$A|"

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

Вы хотели сказать
A="http://example.com/";
A="$(echo blah | tr "|" " ")"
echo blah | sed "s|^|$A|"


Впрочем, это защитит от злонамеренного использования, но не защитит от непонятных ошибок при "неправильных" данных.
Спасибо сказали:
Аватара пользователя
rm_
Сообщения: 3340
Статус: It's the GNU Age
ОС: Debian

Re: Как экранировать (escape) строки в шелле?

Сообщение rm_ »

/dev/random писал(а):
24.03.2010 11:27
Вы хотели сказать
A="http://example.com/";
A="$(echo blah | tr "|" " ")"
echo blah | sed "s|^|$A|"

Да, почти:

Код: Выделить всё

A="http://example.com/";
A=`echo $A | tr "|" " "`
echo whatever | sed "s|^|$A|"
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Как экранировать (escape) строки в шелле?

Сообщение drBatty »

rm_ писал(а):
24.03.2010 11:04
Нужно сделать это автоматически, т.к. в отличие от этого простого примера, $X берётся из вводимого пользователем значения, и может быть равна вообще чему угодно.

есть ещё вариант - создайте файл с нужными sed-командами, а затем просто выполните его как sed скрипт. В некоторых случаях это оптимальное решение. Кроме того, в sed скриптах можно использовать любые кавычки (в отличие от одностроков, в которых использовать кавычки нельзя, ведь сам sed скрипт в кавычках).
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: