2016-04-11 2 views
1

У меня есть скрипт bash для teamcity.It ставит значение переменных build в файл с использованием заполнителей.bash auto escaping не-буквенно-цифровых символов

sed -i "" 
-e "s/BUNDLE_VERSION/%bundle_version%/" 
-e "s/BUNDLE_ID/%bundle_id%/" 
-e "s/APP_TITLE/%title%/" "%system.teamcity.build.tempDir%/info.plist" 

% var% - заменено на значение var перед запуском скрипта bash по команде.

Он не работает с переменными, которые имеют ', ", / и, возможно, другие не буквенно-цифровые символы. Например, с title = Auto Shop "SuperCar" он выходит из строя

[12:22:07] СЭД: 1: "" s/Приложению APP_TITLE/Авто ... ": недопустимый код команды"

Как исправить скрипт для работы с не-буквенно-цифровыми символами?

+1

Не используйте sed. Используйте awk или perl и передайте переменные в. – 123

ответ

1

Перед передачей его sed избежать специальные/мета-символы, как это:

BUNDLE_VERSION=$(echo "$BUNDLE_VERSION" | sed -r 's/\\/\\\\/g;s/\//\\\//g;s/\^/\\^/g;s/\[/\\[/g;s/'\''/'\'"\\\\"\'\''/g;s/\]/\\]/g;s/\*/\\*/g;s/\$/\\$/g;s/\./\\./g') 

Пример:

$ echo "^[a/b'c\d]*$." | sed -r 's/\\/\\\\/g;s/\//\\\//g;s/\^/\\^/g;s/\[/\\[/g;s/'\''/'\'"\\\\"\'\''/g;s/\]/\\]/g;s/\*/\\*/g;s/\$/\\$/g;s/\./\\./g' 
\^\[a\/b'\''c\\d\]\*\$\. 

и использовать одиночные кавычки при отдаче в переменных для основного выражения. Лучше использовать другой инструмент для передачи переменных, например awk-v.