sed regex с '+' не работает - почему?


0

Я не понимаю это Я хотел бы заменить 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.
linux  regex  sed 

Ответы:


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

Это не типично для программ GNU (AFAIK), но вы правы ... Хм ... как я могу принять оба хороших ответа?

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/'

ОК, но я пробовал это с ключом -r, и он не работал.

@deadcandidate Используете ли вы GNU sed? Я думаю, нет. Попробуйте использовать -E вместо.
oliv

oliv смотрите обновление в конце поста

0

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.