2016-03-31 4 views
0

Я пытаюсь заменить команду sed командой sed, и она продолжает падать, поэтому после нескольких часов «пикетирования» я подумал, что задаю здесь вопрос.Замена sed с sed на RHEL6.7

У меня есть различные сценарии Баш, которые содержат этот вид линии:

sed 's/a hard coded server name servername.//' 

Я хотел бы заменить его:

sed "s/a hard coded server name $(hostname).//" 

Обратите внимание на добавление в двойные кавычки, так что $ (имя хоста), что делает это немного сложнее, чем я ожидал.

Так что это был мой первый из многих неудачных попыток:

cat file | sed 's!sed \'s\/a hard coded server name servername.\/\/\'!sed \"s\/a hard coded server name $(hostname).\/\/\"!g' 

Я также попытался с помощью СЭД хорошо «-e» вариант, чтобы сломать заменить на части, чтобы попытаться и нацелены на проблемные области. Я бы не использовать «-e» переключатель в растворе, но она иногда полезно для отладки:

cat file | sed -e 's!servername!\$\(hostname\)!' -e 's!\| sed \'s!\| sed \"s!' 

Первые SED произведения, как и ожидалось (ничего фантазии здесь происходит), а второй не может так ни одна точка не добавляя третий, который должен был бы заменить закрывающую двойную кавычку.

В этот момент моя история спускается в хаос, поэтому нет смысла добавлять больше неудачных попыток.

Я хотел использовать первую замену в одной команде, так как сценарий полон sed команд, и я хотел настроить только одну конкретную команду в скрипте.

Любые идеи будут оценены.

+2

Вы не можете избежать одиночных кавычек в одинарных кавычках, которые вам нужны для использования двойных кавычек снаружи или использовать '' \ '' 'для каждой внутренней одиночной кавычки. Это говорит, что здесь http://stackoverflow.com/q/29613304/258523. –

+1

Не помещайте всю команду sed в двойные кавычки или вам нужно беспокоиться о других вещах, скрывающихся во время будущих обновлений. Просто выйдите из одинарных кавычек для части, которую вы хотите расширить оболочку: 'sed '/ имя жесткого кодированного сервера' '$ (имя хоста)".// '' –

+0

Я думал, что я избежал одной отдельной цитаты правильно в команде, не могли бы вы расширить @Etan? – Chris

ответ

0

Вот как вы можете это сделать в AWK, если игнорировать (или ручку) metachars в старом и новом тексте, как вы бы с СЕПГ:

$ awk -v old="sed 's/a hard coded server name servername.//'" \ 
     -v new="sed 's/a hard coded server name '\"\$(hostname)\"'.//' \ 
      '{sub(old,new)}1' file 
sed 's/a hard coded server name '"$(hostname)"'.//' 

или избежать необходимости иметь дело с metachars, используйте только строки для сравнения и замены:

$ awk -v old="sed 's/a hard coded server name servername.//'" \ 
     -v new="sed 's/a hard coded server name '\"\$(hostname)\"'.//'" \ 
      's=index($0,old){$0=substr($0,1,s-1) new substr($0,s+length(old))}1' file 
sed 's/a hard coded server name '"$(hostname)"'.//' 
0

Следите за поведением инструментов шаблонов, используя последовательность, которая никогда не должна отображаться при фактическом использовании и заменять ее. Например, используя двоеточие просто потому, что они требуют меньше процитировать:

#!/bin/bash 
sed "s/:servername:/$(hostname)/g" <<EOF > my_new_script.bash 
    echo "This is :servername:" 
EOF 

Я использовал echo во внутреннем сценарии для целей ясности. Вы могли бы в равной степени использовали что-то вроде:

sed 's/complex substitution :servername:/inside quotes :servername:/' 

который избегает цитирования неприятностей, потому что внешний sed будет обрабатывать здесь документ как обычный текст.

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