2015-01-27 3 views
1

У меня есть такой код:Заменить содержимое строки в СЭД с помощью специальных символов

sed "s/TEST_CASES_R/$testCaseLocations/g" template >> newfile 

где $testCaseLocations имеет ,tests/test/,tests/test/2. Так эта линия не удается, как:

плохого флаг заменитель команды

Как я могу решить эту проблему?

+0

Возможный дубликат [sed: удалить с помощью другого разделителя] (http://stackoverflow.com/questions/1797906/sed-delete-using-a-different-delimiter) – NeronLeVelu

ответ

3

Ах, Sed инъекции кода. Что видит sed

sed "s/TEST_CASES_R/,tests/test/,tests/test/2/g" template >> newfile 

... что является бессмысленным. Корневая проблема заключается в том, что sed не может различать вещи, которые вы хотите видеть, как данные - содержимое $testCaseLocations - и инструкции.

Лучшее решение на мой взгляд, использовать AWK:

awk -v replacement="$testCaseLocations" '{ gsub(/TEST_CASES_R/, replacement); print }' template >> newfile 

, потому что это аккуратно обходит проблемы внедрения кода, не обрабатывать testCaseLocations как код. Вы могли бы, в данном конкретном случае, а также использовать различные разделители для СЭД, такие как

sed "[email protected][email protected][email protected]" template >> newfile 

, но тогда вы столкнетесь с проблемами, если $testCaseLocations содержит @, или если она содержит символ, который имеет значение для СЭД в контексте, где он появляется, например \ или &.

+0

Спасибо за решение awk. Аккуратный. – batman

+0

Gsub по умолчанию равен $ 0, поэтому последний аргумент не нужен. –

+0

@JID Правильно, спасибо. Сделал изменения. – Wintermute

2

Просто используйте другой разделитель для sed, иначе он видит так много черт вокруг: sed 's#hello#bye#g' в порядке.

В вашем случае:

sed "s#TEST_CASES_R#$testCaseLocations#g" template >> newfile 

Смотрите еще одно испытание:

$ var="/hello" 
$ echo "test" | sed "s/test/$var/g" 
sed: -e expression #1, char 9: unknown option to `s' 
$ echo "test" | sed "s#test#$var#g" 
/hello 
Смежные вопросы