awk,sed或vim正则表达式

Jan*_*Jan 4 regex vim awk sed

我正在寻找将字符串添加到现有字符串的最佳方法,而我不想替换整个字符串.

self.fields_desc.append(BitField("foo", 0x3, 4))
Run Code Online (Sandbox Code Playgroud)

可以替换为:

self.fields_desc.append(BitField("foo" + str(self.__class__.i), 0x3, 4))
Run Code Online (Sandbox Code Playgroud)

使用哪种工具可以让我尽可能少地解决这个问题?在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
Run Code Online (Sandbox Code Playgroud)

但我不知道如何告诉vim不要替换我写的正则表达式.你能帮我个忙吗?

MGw*_*nne 5

使用捕获组(注意"("和")"之前的"\",以及"\ 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
Run Code Online (Sandbox Code Playgroud)

变化:

self.fields_desc.append(BitField("foo", 0x3, 4))
self.fields_desc.append(BitField("test", 0x5, 3))
Run Code Online (Sandbox Code Playgroud)

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

注意:

  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之后添加一个*.虽然我建议使用标准化代码.

请参阅正则表达式分组正则表达式"点".


正如sidyll所说,学习使用内置字符类"\ 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
Run Code Online (Sandbox Code Playgroud)

这既简洁又可读.另外,读者会认为你有一些特殊的理由来定义你自己的角色类(也就是说,他们会读两遍以确保那里没有一些未知的角色).