2017-01-24 3 views
2

У меня короткий Баш скрипт для замены UUID в строке в файле:Как сохранить присутствие меток кавычек от ввода с помощью sed?

#!/bin/sh 

alpha="0-9A-F" 
uuidPtn="[$alpha]{8}-[$alpha]{4}-[$alpha]{4}-[$alpha]{4}-[$alpha]{12}" 
ProductCode="\"ProductCode\" = \"8:{0059DDB5-D384-46F9-BBFD-0004A8C39732}\"" 

newguid=`uuidgen` 
newguid="${newguid^^}" 

cmd="echo $ProductCode | sed -r s/$uuidPtn/$newguid/" 

echo "$ProductCode" 
eval "$cmd" 

Он производит почти правильный вывод, но с кавычками опущено:

"ProductCode" = "8:{0059DDB5-D384-46F9-BBFD-0004A8C39732}" 
ProductCode = 8:{A4B1D092-1C56-44F3-B096-34B67A5F39B1} 

Как я могу включить кавычки?

+0

бы использовать одиночные кавычки в файле 'ProductCode = 'ProductCode "= ... 2}"' 'декларация ничего не меняет? – Aserre

+0

ProductCode имеет правильное значение, как видно из вывода. –

+1

Я проверил вас de, проблема заключалась в том, что вам нужны одинарные кавычки вокруг объявления 'cmd', иначе кавычки будут разворачиваться дважды (один во время объявления, один раз во время eval). – Aserre

ответ

1

Рад, что у вас это работает! Вот еще один способ, который не включает в себя evaleval is evil):

#!/bin/bash 

alpha="0-9A-F" 
uuidPtn="[$alpha]{8}-[$alpha]{4}-[$alpha]{4}-[$alpha]{4}-[$alpha]{12}" 
ProductCode="\"ProductCode\" = \"8:{0059DDB5-D384-46F9-BBFD-0004A8C39732}\"" 

newguid=`uuidgen` 
newguid="${newguid^^}" 

#cmd="echo "$ProductCode" | sed -r s/$uuidPtn/$newguid/" ## Not this 

echo "$ProductCode" 
#eval "$cmd"          ## Not this either 

#     v     v whole pattern quoted 
changedcode=$(sed -r "s/$uuidPtn/$newguid/" <<<"$ProductCode") 
#   ^^   command substitution    ^
#     here-strings for input ^^^^^^^^^^^^^^^^^ 
echo "$changedcode" 

Выход:

"ProductCode" = "8:{0059DDB5-D384-46F9-BBFD-0004A8C39732}" 
"ProductCode" = "8:{6094CF73-E23E-4655-B4A8-DAA57BE7EF72}" 
+0

Замените '[$ alpha]' на класс символов POSIX '[[: xdigit:]]', и вы должны по умолчанию всегда использовать одинарные кавычки по правой стороне назначений, если вам не нужны двойные кавычки по какой-то причине, а затем в дополнение к другие преимущества вам не нужны, чтобы избежать двойных кавычек в ваших назначениях переменных: 'ProductCode = '' ProductCode" = "8: {0059DDB5-D384-46F9-BBFD-0004A8C39732}" ''. Кроме того, вы используете '$ (..)' в некоторых местах - всегда используйте его вместо устаревших backticks, а sed -r - специфичный для GNU, вместо этого используйте sed -E для переносимости как для GNU, так и для OSX. –

-1

я решил свою собственную проблему, изменив CMD = строку следующим образом:

cmd='echo $ProductCode | sed -r "s/$uuidPtn/$newguid/"' 

спасибо за глаза на людей, хотя.

+0

причина для downvote? –

1

Это является Sh версии

#!/bin/sh 

alpha="0-9A-F" 
uuidPtn="[$alpha]{8}-[$alpha]{4}-[$alpha]{4}-[$alpha]{4}-[$alpha]{12}" 
ProductCode="\"ProductCode\" = \"8:{0059DDB5-D384-46F9-BBFD-0004A8C39732}\"" 

newguid=`uuidgen` 
newguid=$(echo "${newguid}" | tr a-z A-Z) 

ChangedCode=$(echo "$ProductCode" | sed -r s/$uuidPtn/$newguid/) 

echo "$ProductCode" 
echo "$ChangedCode" 

 Смежные вопросы

  • Нет связанных вопросов^_^