vim / regex: заменить все между четвертой и пятой точкой с запятой - PullRequest
0 голосов
/ 13 декабря 2018

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

Каждый файл заполнен сотнями строк, которые выглядят так:

ABC  ;1  ;0  ;36.  ;0.   ;0.   ;0!
DEF  ;1  ;0  ;42.  ;0.47 ;0.47 ;0!

Мой план состоит в том, чтобы создать скрипт bash, который может проходить через каждый файл и заменять определенные значения.

Например, я хочу заменить «0».после четвертой точки с запятой «0,66» в первой строке.Я также хочу заменить «0,47» после четвертой точки с запятой на «0,99» во второй строке.

Другими словами, я хочу это:

ABC  ;1  ;0  ;36.  ;0.   ;0.   ;0!
DEF  ;1  ;0  ;42.  ;0.47 ;0.47 ;0!

Чтобы это было:

ABC  ;1  ;0  ;36.  ;0.66 ;0.   ;0!
DEF  ;1  ;0  ;42.  ;0.99 ;0.47 ;0!

Некоторые сложности:

  1. это грязный файл с различным количеством пробелов (пробелы и табуляции) между точками с запятой
  2. иногда числа между точками с запятойявляются целыми числами (например, 0), а иногда они являются десятичными (например, «0» или «0,1701»)

Таким образом, на самом деле строки могут выглядеть примерно так:

ABC  ;1  ;0    ;36.  ;0;0.;0!
DEF  ;1;0  ;42.  ;0.47     ;0.47       ;0!

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

1 Ответ

0 голосов
/ 13 декабря 2018

Вы можете сделать это с помощью sed -E:

's/(?<=[\w\s]+(?:;[0-9\s\.]+){3};)[0-9\.]+/0.66/g'

Пояснение

(?<=) является положительным взглядом сзади, который совпадает только в случае совпадения предыдущих символовшаблон внутри внешнего вида

[\w\s]+ соответствует одной или нескольким буквам, подчеркиваниям или пробелам

(?:) - это группа без захвата, позволяющая группировать шаблоны без их захвата

;[0-9\s\.]+ будет соответствовать точке с запятой, за которой следуют одна или несколько цифр, пробелов или периодов

{3}, что весь шаблон будет совпадать ровно 3 раза

[0-9\.]+ соответствует одномуили более цифр или периодов

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