Задать вопрос
Zolushok
@Zolushok
прокрастинатор-перфекционист

Как заставить sed искать не с начала строки с квантификатором '*'?

Дано:

# echo 'abcd' | sed -e 's/a*//'
bcd (как и ожидалось)
# echo 'abcd' | sed -e 's/b*//'
abcd (почему?!!)

Как переписать выражение, чтобы получить во втором случае acd?
  • Вопрос задан
  • 273 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 2
~$ echo 'abcd' | sed -e 's/b*//g'
acd
Ответ написан
@abcd0x00
[guest@localhost ~]$ echo 'abcd' | sed 's/bb*//'
acd
[guest@localhost ~]$


abcd (почему?!!)

Ты не понимаешь, как он работает. b* совпадает с пустотой. А пустота где? Пустота в начале. Поэтому он берёт эту пустоту совпавшую и заменяет на пустоту.

Добавим замену на x и видим это наглядно
[guest@localhost ~]$ echo 'abcd' | sed 's/b*/x/'
xabcd
[guest@localhost ~]$


Если же ты поставишь там в конце g, это совсем по-другому работает
[guest@localhost ~]$ echo 'abcdabcd' | sed 's/b*/x/g'
xaxcxdxaxcxdx
[guest@localhost ~]$

Это совсем не то, что надо (он заменил все пустоты и все b).

Поэтому, если тебе надо заменить только первое вхождение с b, используется либо +, либо аналог плюса через звёздочку
[guest@localhost ~]$ echo 'abcdabcd' | sed 's/bb*/x/'
axcdabcd
[guest@localhost ~]$
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@zzzevaka
% echo 'abcd' | sed -E 's/b+//'
acd
% echo 'abcd' | tr -d b
acd
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы