Regex найти и заменить в vim: добавление .0 к числам - PullRequest
3 голосов
/ 26 июля 2010

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

1   1  0  #  1 
6   1  0  #  2 
8   1  0  #  3 
10  1  0  #  4 
12  1  0  #  6 

Как я могу добавить .0 ко всем числам, кроме чисел за #. Я думаю, что это не должно быть слишком сложно сделать с регулярным выражением, но мои знания регулярных выражений слишком ржавые ..

Ответы [ 4 ]

8 голосов
/ 26 июля 2010

С VIM:

:%s/\v(#.*)@<!\d+/&.0/g

Объяснение: \v = очень магия (см. help \v), @<! Соответствует нулевой ширине, если предыдущий атом НЕ совпадает непосредственно перед тем, что следует (см. help \@<!). Остальная часть шаблона заменяет строки из 1 или более цифр той же строкой, за которой следует .0.

7 голосов
/ 26 июля 2010

Если ваши цифры после # не имеют пробелов после них, вы можете использовать:

:g/\([0-9]\+\) /s//\1.0 /g

Использование () создает группы, которые вы можете назвать \D взамещающий текст, где D - позиция группы в строке поиска.Это даст вам:

1.0   1.0  0.0  #  1
6.0   1.0  0.0  #  2
8.0   1.0  0.0  #  3
10.0  1.0  0.0  #  4
12.0  1.0  0.0  #  6

Если у них есть пробелы после них (что у вас, похоже, есть), вы получите:

1.0   1.0  0.0  #  1.0
6.0   1.0  0.0  #  2.0
8.0   1.0  0.0  #  3.0
10.0  1.0  0.0  #  4.0
12.0  1.0  0.0  #  6.0

вв таком случае вы можете сделать:

:g/\.0\(  *\)$/s//\1/g

чтобы исправить это.

1 голос
/ 26 июля 2010

Предполагая, что он правильно сформирован, используя sed, это должно сработать.

РЕДАКТИРОВАТЬ: Просто чтобы уточнить, vim не был прикреплен в качестве тега к этим вопросам, когда я увидел его.

sed 's/\([0-9]\+\) \+\([0-9]\+\) \+\([0-9]\+\)/\1.0 \2.0 \3.0/' file
0 голосов
/ 26 июля 2010

Вы можете попробовать это также sed 's / [0-9] / &. 0 / g' |sed 's / .0 [] * $ // g'

Первый sed добавляет .0 все числа, а второй удаляет завершающий .0

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