Sed заменитель рекурсивно - PullRequest
       3

Sed заменитель рекурсивно

9 голосов
/ 03 апреля 2012

echo ddayaynightday | sed 's/day//g'

В конечном итоге daynight

Есть ли в любом случае, чтобы заменить его до тех пор, пока больше не совпадет?

Ответы [ 6 ]

18 голосов
/ 03 апреля 2012

Моя предпочтительная форма, для этого случая:

echo ddayaynightday | sed -e ':loop' -e 's/day//g' -e 't loop'

Это то же самое, что и у всех остальных, за исключением того, что она использует несколько команд -e для создания трех строк и использует конструкцию t, котораяозначает «ветвь, если вы сделали успешную замену» - повторять.

5 голосов
/ 03 апреля 2012

Это может работать для вас:

echo ddayaynightday | sed ':a;s/day//g;ta'
night
3 голосов
/ 03 апреля 2012

Флаг g преднамеренно не совпадает с замещенной частью строки. То, что вам нужно сделать, немного по-другому. Попробуйте это:

echo ddayaynightday | sed $':begin\n/day/{ s///; bbegin\n}'

Из-за причудливости BSD Sed требуются встроенные символы новой строки. Если вы используете GNU Sed, вам, возможно, удастся обойтись без

sed ':begin;/day/{ s///; bbegin }'
2 голосов
/ 03 апреля 2012

с bash:

str=ddayaynightday
while true; do tmp=${str//day/}; [[ $tmp = $str ]] && break; str=$tmp; done
echo $str
2 голосов
/ 03 апреля 2012

работают следующие работы:

$ echo ddayaynightday | sed ':loop;/day/{s///g;b loop}'
night

В зависимости от вашей системы, ; может не работать для разделения команд, поэтому вы можете использовать следующее:

echo ddayaynightday | sed -e ':loop' -e '/day/{s///g
                                               b loop}'

Пояснение:

:loop       # Create the label 'loop'
/day/{      # if the pattern space matches 'day'
  s///g     # remove all occurrence of 'day' from the pattern space
  b loop    # go back to the label 'loop'
}

Если часть команды b loop не выполнена, печатается текущее содержимое пространства шаблона и читается следующая строка.

0 голосов
/ 03 апреля 2012

Хорошо, вот они: , а и strlen в bash. Используя их, можно реализовать мою идею:

Повторяйте, пока его длина не перестанет изменяться.

Нет ни способа установить флаг, ни способа написать такое регулярное выражение, чтобы «заменить до тех пор, пока больше не будет совпадений».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...