Первая проблема в том, что \d
не делает то, что вы думаете. Используйте [0-9]
как минимум.
Вы все еще получаете host =host
, что мне кажется безумным.
EDIT:
Хорошо
echo "host = 1234" | sed 's/#*\host[ \t]*=[ \t]*\([0-9]*\)/host = asdf/g'
- Зачем захватывать хост, если он всегда один и тот же? Просто перепишите это.
- Зачем сохранять точную информацию табуляции / пробела? Просто перепишите его.
- Зачем избегать вещей, которые не являются особенными?
Надеюсь, вы поняли.
Но вот что вы, вероятно, хотите:
sed '/^#/!s/[ \t]*\([^ \t]*\)[ \t]*=[ \t]*\([^ \t]*\)/\1 = newvalue/g' input_file
Это изменит anything = anything
на anything = newvalue
в некомментированных строках input_file
. Чтобы сделать его специфическим ключом, который заменяется на newvalue
, используйте:
sed '/^#/!s/[ \t]*\(host\)[ \t]*=[ \t]*\([^ \t]*\)/\1 = newvalue/g' input_file
например заменить только строки, читающие host = anything
.