У меня есть вход в/и т.д./хостов:Заменить несколько пробелов, начиная строку с SED
127.0.0.1 fake.hostname.net fake
Я хочу, чтобы заменить второй fake
с real
. Следующий СЕПГ оператор пытается фильтровать две части путем сопоставления двух пространств и раньше, но он ничего не делает:
sed -i -e 's/ fake/ new/g' /etc/hosts
Результат является:
127.0.0.1 fake.hostname.net fake
Ожидаемый результат:
127.0.0.1 fake.hostname.net new
I также попробовали следующие результаты с такими же результатами:
sed -i -e 's/\s\sfake/\s\snew/g' /etc/hosts
Почему это происходит, и что я могу сделать, чтобы исправить это? Я запускаю сервер Ubuntu 14.04.1. Я не хочу, чтобы просто заменить второй матч, как я ожидал что-то вроде:
127.0.0.1 asdf.hostname.net fake
, так что согласующее пространства является единственным приемлемым методом.
echo "127.0.0.1 fake.hostname.net fake" | sed -e 's/ fake/ new/g'
Возвращает ожидаемый результат, но тот же оператор не записывает файл. Просто не помещая лишние пробелы в записи оператора в файл, так что это не проблема с разрешениями файловой системы.
Вы можете подтвердить, что выражение работает как ожидалось, если вы используете 'cat':' cat/etc/hosts | sed -e 's/fake/new/g''? также, убедитесь, что пробелы - это, по сути, пробелы, а не вкладки? –
@WilliBallenthin Он делает: 'echo" 127.0.0.1 fake.hostname.net fake "| sed -e 's/fake/new/g'' и да, это пробелы, а не вкладки. Если я не помещаю пробелы в выражение, файл обновляется, поэтому это не проблема. Stack Overflow запускает двойное пространство даже при форматировании кода. – vemacs