2017-01-31 5 views
3

Мой оригинальный файл:Ошибка при попытке изменить файл с 'SED -i'

nameserver 123.23.23.12 
nameserver 10.0.1.13 

Я хочу изменить его на:

nameserver 10.0.0.1 
nameserver 10.0.1.13 

команды, что я использую:

sed -i 's/nameserver*/nameserver 10.0.0.1/g' resolve.conf 

Ошибка, которую я получаю:

sed: -i may not be used with stdin 

Кроме того, когда я использую ниже, чтобы проверить результат:

sed 's/nameserver*/nameserver 10.0.0.1/g' resolve.conf 

я получаю:

nameserver 10.0.0.1 123.23.23.12 

Во втором случае, это не заменяет полную строку, а просто добавив мою замену текста ,

Любая идея, что я делаю неправильно?

Спасибо!

ответ

2
sed 's/nameserver*/nameserver 10.0.0.1/g' resolve.conf 

матчи только nameserve следуют ноль или более вхождений r - по существу, только nameserver.

Если вы хотите заменить все после nameserver, используйте этот шаблон:

sed 's/nameserver.*/nameserver 10.0.0.1/g' resolve.conf 

Но что бы в конечном итоге подставляя обе строки в resolv.conf. Почему бы просто не заменить часть IP-адреса?

Для замены только первое вхождение, вы можете следить за этот пост: How to use sed to replace only the first occurrence in a file?

Чтобы решить эту проблему с sed -i, передать параметр нулевой длины в опции -i так, что она обходит создание резервной копии файла:

sed -i '' ... 
+0

Hi, IP-адрес часть динамична. Это может быть что угодно – Dadu

+0

Пробовал: sed -i '' 's/nameserver. */Nameserver 10.0.0.1/g' resolve.conf. По-прежнему получается такая же ошибка. sed: -i не может использоваться с stdin – Dadu

+0

Попробуйте 'sed -i ''' - с пробелом после '-i'. Я пробовал без этого места на Mac OS и Ubuntu, и это сработало. На какой ОС вы работаете? – codeforester