Как использовать команду sed, чтобы заключить значение переменной в одинарные кавычки
Я установил переменную ENV, как это
setenv ENV {"a":{"b":"http://c","d":"http://e"}}
Я использую Sed, как это
sed 's|(ENV)|('"$ENV"')|' aFile
Заменяет (ENV)
со следующим
(a:b:http://c a:d:http://e)
Однако, если я устанавливаю переменную как это в одинарных кавычках
setenv ENV '{"a":{"b":"http://c","d":"http://e"}}'
Он заменяет вот так
({"a":{"b":"http://c","d":"http://e"}})
Но мне бы хотелось, чтобы выход sed для (ENV)
быть
('{"a":{"b":"http://c","d":"http://e"}}')
1 ответ
Прежде всего, важно указать (или избежать) вашу переменную по определению (с setenv
), как объясняется в этом ответе, поскольку фигурные скобки и двойные кавычки (среди прочих) являются метасимволами в C-оболочке.
Вы можете заключить полное значение в одинарные кавычки:
$ setenv ABC '{"a":{"b":"http://c","d":"http://e"}}'
$ echo "$ABC"
{"a":{"b":"http://c","d":"http://e"}}
Или избежать метасимволов с обратными слешами, например так:
$ setenv ABC \{\"a\":\{\"b\":\"http://c\",\"d\":\"http://e\"\}\}
$ echo "$ABC"
{"a":{"b":"http://c","d":"http://e"}}
Теперь для sed
часть вашего вопроса - а как процитировать переменную на замену.
Просто добавьте одинарные кавычки в свой sed
замена выражения и готово:
$ setenv ABC '{"a":{"b":"http://c","d":"http://e"}}'
$ echo '(ABC)' | sed 's|(ABC)|('"'$ABC'"')|'
('{"a":{"b":"http://c","d":"http://e"}}')
Обратите внимание, кроме того, вы также должны позаботиться о побеге sed
метасимволы замены (только эти три: \
, /
, а также &
) в вашей переменной. Вы, кажется, знаете об этом, так как вы уже используете |
в качестве разделителя в вашем регулярном выражении, но если вы не уверены в том, что содержит ваша переменная, всегда хорошо избежать этого. Подробнее о надежных экранирующих метасимволах в sed
смотри этот ответ. Короче говоря, чтобы избежать однострочного шаблона замены, выполните его через sed 's/[&/\]/\\&/g'
,