2017-02-10 10 views
-1

У меня есть переменная с кучей данных.Как заменить текст с помощью переменной в сценарии оболочки

text = "ABCDEFGHIJK" 
file = garbage.txt //iiuhdsfiuhdsihf]sdiuhdfoidsoijsf 

Что я хотел бы сделать, это заменить] charachter в файле текстом. Я пробовал использовать sed, но я продолжаю получать нечетные ошибки.

вывод должен быть:

//iiuhdsfiuhdsihfABCDEFGHIJKsdiuhdfoidsoijsf 
+0

какая оболочка вы используете? посмотрите, разрешает ли это пространство использовать '=' для назначения переменных ... и добавляет команду sed, которую вы пытались ... – Sundeep

ответ

0

Просто необходимо, чтобы избежать ] характера с \ в регулярных выражениях:

text="ABCDEFGHIJK" 
sed "s/\(.*\)\]\(.*\)/\1$text\2/" file > file.changed 

или для редактирования на месте:

sed -i "s/\(.*\)\]\(.*\)/\1$text\2/" file 

Тест:

sed "s/\(.*\)\]\(.*\)/\1$text\2/" <<< "iiuhdsfiuhdsihf]sdiuhdfoidsoijsf" 

# output => iiuhdsfiuhdsihfABCDEFGHIJKsdiuhdfoidsoijsf 
+0

Не работает в оболочке mac – KingKongFrog

+0

Какая ошибка вы получаете? Вы запускали с опцией -i или нет? Я думаю, что версия Mac нуждается в аргументе '-i'. Итак, вы можете попробовать '-i '''. – codeforester

+0

Вы можете попытаться явно привязать выражения для обратных ссылок, например. 'sed 's/^ \ (. * \) \] \ (. * $ \)/\ 1 $ text \ 2 /" ' –

0

Существует всегда Баш путь, который должен работать в вашем OSX:

filevar=$(cat file) 
echo "${filevar/]/$text}" #to replace first occurence 
OR 
echo "${filevar//]/$text}" #to replace all occurences 

В моем Баше я даже не придется бежать ].

Кстати, простой sed не работает?

$ a="AA" 
$ echo "garbage.txt //iiuhdsfiuhdsihf]sdiuhdfoidsoijsf" |sed "s/]/$a/g" 
garbage.txt //iiuhdsfiuhdsihfAAsdiuhdfoidsoijsf