awk, sed или vim regex - PullRequest
       7

awk, sed или vim regex

4 голосов
/ 20 июля 2011

Я ищу лучший способ добавить строку в существующую строку, в то время как я не хочу заменять всю строку.

self.fields_desc.append(BitField("foo", 0x3, 4))

может быть заменено на:

self.fields_desc.append(BitField("foo" + str(self.__class__.i), 0x3, 4))

Использование какого инструмента позволит мне сделать это с наименьшими возможными проблемами? В VIM я мог бы сделать:

:%s/self.fields_desc.append(BitField("[a-zA-Z0-9]*", 0x[0-9]*, [0-9]*))/self.fields_desc.append(BitField("foo" + str(self.__class__.i), 0x3, 4))/g

Но я не знаю, как я скажу vim не заменять регулярное выражение, которое я написал. Не могли бы вы помочь мне, пожалуйста?

Ответы [ 2 ]

5 голосов
/ 20 июля 2011

Используйте группы захвата (обратите внимание на "\" перед "(" и ")" и "\ 1", "\ 2" и т. Д.):

:%s/self\.fields_desc\.append(BitField(\("[a-zA-Z0-9]*"\), \(0x[0-9]\+\), \([0-9]\+\)))/self.fields_desc.append(BitField(\1 + str(self.__class__.i), \2, \3))/g

изменения:

self.fields_desc.append(BitField("foo", 0x3, 4))
self.fields_desc.append(BitField("test", 0x5, 3))

до

self.fields_desc.append(BitField("foo" + str(self.__class__.i), 0x3, 4))
self.fields_desc.append(BitField("test" + str(self.__class__.i), 0x5, 3))

Примечание:

  1. Я избежал ".", Как "."соответствует любому символу (кроме новой строки), и вы хотите литерал "."персонаж.
  2. Я заменил * на + для совпадений чисел: я сомневаюсь, что вы хотите сопоставить self.fields_desc.append(BitField("foo", 0x,) и т. Д.
  3. Если вы не уверены, правильный ли интервалто есть, у вас не всегда есть self.fields_desc.append(BitField("foo", 0x3..., но иногда self.fields_desc.append(BitField("foo",0x3 или self.fields_desc.append(BitField("foo", 0x3, затем добавьте * после пробелов.Хотя я бы посоветовал вместо этого стандартизировать ваш код.

См. Группировка регулярных выражений и Регулярная "точка" .


Как говорит Сидайл, вероятно, лучше научиться использовать встроенные классы символов "\ d", "\ w" (см. Сокращенные классы символов ) и т. Д .:

:%s/self\.fields_desc\.append(BitField(\("\w*"\), \(0x\d\+\), \(\d\+\)))/self.fields_desc.append(BitField(\1 + str(self.__class__.i), \2, \3))/g

Это как для краткости, так и читабельности.Кроме того, в противном случае читатели будут предполагать, что у вас есть особая причина для определения собственного класса символов (то есть, они будут читать его дважды, чтобы убедиться, что там нет какого-то неизвестного символа).

1 голос
/ 20 июля 2011

Пожалуйста, избегайте ненужных совпадений и замен.Используйте встроенные классы персонажей.И избежать этих точек.Здесь нет необходимости группировать вещи.

:%s/self\.fields_desc\.append(BitField("\w*"\zs\ze, 0x\d, \d))/ + str(self.__class__.i)

Возможно, вам не нужен флаг g , я сомневаюсь, что два из них появятся в одной строке.

См. :h \zs и :h \ze.

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