Найти и заменить регулярное выражение альтернативным форматом - PullRequest
0 голосов
/ 12 января 2020

У меня есть файл, в котором есть строки, содержащие такой текст

something,12:3456789,somethingelse
foobar,12:345678,somethingdifferent

Для строк, где второй элемент в строке имеет 6 цифр после : Я хотел бы изменить его формат добавив 0 вперед и сдвинув :. Например, приведенное выше изменится на:

something,12:3456789,somethingelse
foobar,01:2345678,somethingdifferent

Я не могу понять, как это сделать, используя sed или любой unix инструмент командной строки

1 Ответ

1 голос
/ 12 января 2020

Вам просто нужно соответствовать средней части, где у вас есть 2 цифры, за которыми следует :, а затем точно 6 цифр. Если вы фиксируете текст в отдельных группах надлежащим образом, вы можете перемещать их в своем результате. Обратите внимание, что граница слова \b в конце шаблона должна гарантировать, что мы сопоставляем ровно 6 цифр и не сопоставляем строки, которые имеют полные 7 цифр:

/\b(\d)(\d):(\d{6})\b/0\1:\2\3/
 |__________________| |______|
       pattern       replacement

Это дает ожидаемый вывод. Вы можете поэкспериментировать с ним онлайн здесь


sed не имеет спецификаторов стиля Perl, таких как \d. Вместо этого вам нужно будет использовать [[:digit:]]. Вот обновленное регулярное выражение, которое работает с sed

sed -E 's/\b([[:digit:]])([[:digit:]]):([[:digit:]]{6})\b/0\1:\2\3/g' myfile.txt

Как отметил @Jonathan Leffler, \b не работает с Ma c 'sed, поэтому вам вместо этого нужно будет добавьте запятые в шаблон регулярных выражений спереди и сзади, а затем замените их обратно в шаблоне замены

...