Назад | Перейти на главную страницу

используйте sed в сценарии оболочки для замены IP-адреса в файле

У меня есть сценарий, который находит строку в файле и заменяет ее новой строкой.

$ sed -i 's/$old_string'/'$new_string'/g' $FILENAME

Теперь мне нужно, чтобы условие было регулярным выражением, которое также проверяет, следует ли за старой строкой что-нибудь, кроме числа.

Я пробовал это, но это не сработало:

$ sed -i -r 's/$old_string(^[0-9])+/$new_string/g' $FILENAME

Любая идея?

Чтобы отрицать диапазон в регулярном выражении, каретка должна быть внутри квадратные скобки.

sed -i -r 's/$old_string([^0-9])+/$new_string/g' $FILENAME

Скобки также не нужны в этом случае, если вы не используете обратные ссылки (а это не похоже на вас).

sed -i -r 's/$old_string[^0-9]+/$new_string/g' $FILENAME

И последнее: bash не анализирует переменные внутри одинарных кавычек, поэтому $old_string и $new_string не будет заменен какой-либо переменной bash, которую вы, возможно, установили в своем скрипте, но будет использоваться буквально в этом sed команда. Если вы используете двойные кавычки, они будут заменены.

sed -i -r "s/$old_string[^0-9]+/$new_string/g" $FILENAME

Обновить:

Поскольку файл не содержит что-нибудь после строки, которую вы хотите заменить, [^0-9]+ часть регулярного выражения не имеет ничего общего. Это сработало бы, если бы после IP-адреса был пробел. Вместо этого мы можем сопоставить конец строки с $.

sed -i -r 's/123.123.123.1$/4.4.4.4/g' $FILENAME

Еще одно обновление. Это соответствует любому символу, который не является числом или вообще без символов. Для этого нам нужны круглые скобки, чтобы сгруппировать две опции.

sed -i -r 's/123.123.123.1([^0-9]+|$)/4.4.4.4/g' $FILENAME

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

sed -i -r 's/123.123.123.1([^0-9]+|$)/4.4.4.4\1/g' $FILENAME