Как использовать команду 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',

Другие вопросы по тегам