У меня есть сценарий, который находит строку в файле и заменяет ее новой строкой.
$ 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