Я не понимаю это Я хотел бы заменить строку ip-up 9490:notify_rc на ip-up ****:notify_rc . Я думал, что это просто:

echo "ip-up 9490:notify_rc" | sed -e 's/ip-up [0-9]+:notify_rc/ip-up ****:notify_rc/'

но нет, у меня это не работает, вывод ip-up 9490:notify_rc . Зачем? Как мне это сделать?

Вместо [0-9]+ я пробовал: \S+ [:num:]+ и т.д., Но безуспешно пытался добавить -r к команде sed . Результатом является исходная строка каждый раз.

Если я поменяю + на * , то он станет работать; а что не так со знаком плюс?

Обновить
Вот краткий пример:

echo "ip-up 9490:notify_rc" | sed -e 's/ip-up [0-9]+:notify_rc/ip-up ****:notify_rc/' 
ip-up 9490:notify_rc
echo "ip-up 9490:notify_rc" | sed -e 's/ip-up [0-9]+:notify_rc/ip-up ****:notify_rc/' -r
ip-up 9490:notify_rc
echo "ip-up 9490:notify_rc" | sed -e 's/ip-up [0-9]+:notify_rc/ip-up ****:notify_rc/' -E
ip-up 9490:notify_rc

sed --version
sed (GNU sed) 4.2.2
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Jay Fenlason, Tom Lord, Ken Pizzini,
and Paolo Bonzini.
GNU sed home page: <http://www.gnu.org/software/sed/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
E-mail bug reports to: <bug-sed@gnu.org>.
Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.

3 ответа3

2

Вы чувствуете разницу между регулярным выражением и расширенным регулярным выражением.

Один или несколько операторов + в расширенном регулярном выражении. Вы можете сказать sed что регулярное выражение является расширенным, используя опцию -r или -E .

echo "ip-up 9490:notify_rc" | sed -r -e 's/ip-up [0-9]+:notify_rc/ip-up ****:notify_rc/'

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

echo "ip-up 9490:notify_rc" | sed -e 's/ip-up [0-9]\+:notify_rc/ip-up ****:notify_rc/'
0

Не помещайте ничего (кроме сценария sed ) после ключа -e.

$ echo "ip-up 9490:notify_rc" | sed -r -e 's/ip-up [0-9]+:notify_rc/ip-up ****:notify_rc/'
ip-up ****:notify_rc
0

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

sed -e "s/[0-9]/\*/g"

Это заменит любое число звездочкой.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .