Оболочка: Как заменить что-то из текста сохраненным значением переменной - PullRequest
2 голосов
/ 27 августа 2010

Я сохранил значение с помощью команды оболочки: Например:

timeoutvalue=`echo "timeout=2.0"`

И я должен извлечь значение тайм-аута из другого текста и заменить его на это значение тайм-аута.Например, текст egtest:

<host ip="255.255.255.0" name="testhost" description="hostfortest" connection="xmlrpc" timeout=4.0/>

Я хочу извлечь значение времени ожидания из приведенного выше текста и заменить значение timeout=4.0 на timeout=2.0 (значение, которое я сохранил как переменную в оболочкекоманда).

Моя проблема: (1) для простого теста я хочу заменить значение timeout = 4.0 на $ timeoutvalue.Итак, моя команда:

sed 's/timeout=4.0/$timeoutvalue/g' egtext.

Но, похоже, текст становится:

<host ip="255.255.255.0" name="testhost" description="hostfortest" connection="xmlrpc" $timeoutvalue/>

Может кто-нибудь сказать мне, почему это неправильно?

(2) Для этой проблемы я должен сначала извлечь из текста grep timeout=4.0 и заменить значение 4.0 на сохраненное значение переменной (в моем примере: 2.0).Я подумал, но я не знаю, какую команду использовать для реализации этого (awk? Sed?), Потому что поле текста не определено (например, в этом тексте тайм-аут в $5, но, возможно, вдругой текст, он может быть изменен на $6).Я имею в виду, что это может быть изменено на:

<host ip="255.255.255.0" name="testhost" description="hostfortest" connection="xmlrpc" type="onebox" timeout=4.0/>

Может ли кто-нибудь помочь мне с этим?

Ответы [ 3 ]

2 голосов
/ 27 августа 2010

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

sed "s/timeout=4.0/$timeoutvalue/g" egtext

РЕДАКТИРОВАТЬ:

Рассмотрим

who='world'
echo "Hello $who" # prints Hello world
echo 'Hello $who" # prints Hello $who

как видно, одинарные кавычки не допускают подстановки переменных.$who трактуется буквально как доллар, за которым следует who.Но двойная кавычка ведет себя по-разному, когда она видит $who, она понимает, что who является переменной, и заменяет $who ее значением.

1 голос
/ 27 августа 2010

Я бы написал ваш код следующим образом.

timeoutvalue='timeout=2.0'
sed "s/timeout=[.0-9]*/${timeoutvalue}/" egtext
1 голос
/ 27 августа 2010

Одинарные кавычки запрещают расширение переменной.

sed 's/timeout=4.0/'"$timeoutvalue"'/g' egtext
...