Группировка чисел с помощью sed: подчеркивание для меня не работает

#sed #number-formatting

Вопрос:

Я пытаюсь сгруппировать цифры; Проблема возникает только при использовании символа подчеркивания:

 $ echo "12345678912345678901234567890" | sed ':a;s/B[0-9]{3}($|_)/_amp;/;ta'
 

При использовании других персонажей работа выполняется:

 $ echo "12345678912345678901234567890" | sed ':a;s/B[0-9]{3}($|-)/-amp;/;ta'
 

Также:

 $ echo "12345678912345678901234567890" | sed ':a;s/B[0-9]{3}($|:)/:amp;/;ta'
 

…и так далее. Я пытался убрать подчеркивание, но оно делает то же самое.

Комментарии:

1. Пожалуйста, добавьте свой ожидаемый результат

2. B это отрицаемая версия b , граница слов. Word включает буквенно-цифровые символы и символ подчеркивания. Поэтому B соответствует промежутку между цифрами, а также промежутку между цифрой и подчеркиванием.

3. Я знал значение B, но, похоже, не заметил проблемы, которую это вызывает… это бесконечный цикл, не так ли?

4. Вместо того, чтобы применять ta команду, продублируйте подстановку и наблюдайте за результатом. N. B. значение goto может быть бесконечным и никогда не вернется. --debug Опция в GNU sed также может пролить свет на меньшее. sed '...' file --debug | less

Ответ №1:

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

 sed -E ':a;s/(.*[0-9])([0-9]{3})/1_2/;ta' file
 

Используйте greed ( .* ) для вызова обратного отслеживания, затем найдите 4 цифры подряд и вставьте подчеркивание между первой и второй, повторите.