2015-04-13 2 views
0

Я пытаюсь найти и заменить переменными, но это не сработает.найти и заменить на переменные

Вот код. Мне нужно добавить -C -w 10% -c 5% -p /u0 для добавления в конец соответствующей строки. Я не знаю, как подавить (-) любые идеи? Спасибо.

OLD=$(command[check_disk]=/usr/local/nagios/libexec/check_disk -w 10% -c 5% -p/-p /var -p /tmp -p /home -p /boot -p /usr -A -e) 
NEW=$(command[check_disk]=/usr/local/nagios/libexec/check_disk -w 10% -c 5% -p/-p /var -p /tmp -p /home -p /boot -p /usr -A -e -C -w 10% -c 5% -p /u0) 

sed -i "s/$OLD/$NEW/" /home/scripts/nrpe.cfg 
+0

Непонятно, что вы спрашиваете. Ваши команды 'OLD = $ (...)' и 'NEW = $ (...)' не могут работать, потому что они будут рассматривать 'command [check_disk] =/usr/local/nagios/libexec/check_disk' переменную среды а затем попытается выполнить команду '-w ...' как команду.) – mklement0

+0

Мне просто нужно заменить переменную «old» «новой» одной строкой на другую. Спасибо – pirulo

+0

Поскольку команды внутри '$ (...)' неизменно терпят неудачу, как '$ OLD', так и' $ NEW' будут _empty_, когда ваша команда 'sed' будет достигнута (если только' set -e' не действует, в этом случае сценарий будет отменен после команды «OLD = ...»). – mklement0

ответ

0

Попробуйте это (предполагается bash):

OLD='command[check_disk]=/usr/local/nagios/libexec/check_disk -w 10% -c 5% -p/-p /var -p /tmp -p /home -p /boot -p /usr -A -e' 
NEW='command[check_disk]=/usr/local/nagios/libexec/check_disk -w 10% -c 5% -p/-p /var -p /tmp -p /home -p /boot -p /usr -A -e -C -w 10% -c 5% -p /u0' 

oldEscaped=$(sed 's/[^^]/[&]/g; s/\^/\\^/g' <<<"$OLD") 
newEscaped=$(sed 's/[\\&/]/\\&/g' <<<"$NEW") 

sed -i "s/$oldEscaped/$newEscaped/" /home/scripts/nrpe.cfg 
  • Ваша первая проблема в том, что вы перепутали $(...) для механизма струнной цитировании (не, он используется для command substitution (исполняющему вложенную команду и замену конструкции на вывод команды)).
    Чтобы задать литеральные строки, просто используйте одинарные кавычки, как указано выше.
  • Ваша вторая проблема заключалась в том, что вы не можете слепо передавать строки в sed «s s (строка-замена) команда, поскольку некоторые символы имеют специальное значение для sed, поэтому использовать их буквальноони должны быть escaped - самая очевидная проблема - это экземпляры / в строках, которые ошибочно принимают за разделители команды s/.../.../.
    • Таким образом, 2 вспомогательные sed команд используются для выполнения необходимого вытекающий:
      • sed 's/[^^]/[&]/g; s/\^/\\^/g' <<<"$OLD" экранирует старой строки так, что ни один из его персонажей не может быть ошибочно приняты за регулярное выражение разделителей или специальных символы регулярных выражений.
      • sed 's/[\\&/]/\\&/g' <<<"$NEW" избегает новой строки так, что ни один из его персонажей не может быть ошибочно приняты за регулярное выражение разделителя или обратные ссылки (такие как & или \1).

Наконец, следует отметить, что лучше не, чтобы использовать все заглавные оболочку имен переменных, такие как $OLD, чтобы избежать конфликтов с средой переменных.

+1

Большое спасибо mklement0, он работает. Сегодня я узнаю что-то новое. – pirulo

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