匹配n次后使用正则表达式反向引用

时间:2018-08-23 14:52:36

标签: regex atom-editor regex-group

我需要匹配人偶定义中的几个字符串:

  sysctl::conf { 'net.ipv4.neigh.default.gc_thresh1':  value => '4096' }
  sysctl::conf { 'net.ipv4.neigh.default.gc_thresh2':  value => '8192' }
  sysctl::conf { 'net.ipv4.neigh.default.gc_thresh3':  value => '16384' }
  sysctl::conf { 'net.ipv6.conf.all.disable_ipv6':     value => '0' }
  sysctl::conf { 'net.ipv6.conf.default.disable_ipv6': value => '0' }

然后使用向后引用,添加相同的行,再添加一行,如下所示:

  sysctl::conf { 'net.ipv4.neigh.default.gc_thresh1':  value => '4096' }
  sysctl::conf { 'net.ipv4.neigh.default.gc_thresh2':  value => '8192' }
  sysctl::conf { 'net.ipv4.neigh.default.gc_thresh3':  value => '16384' }
  sysctl::conf { 'net.ipv6.conf.all.disable_ipv6':     value => '0' }
  sysctl::conf { 'net.ipv6.conf.default.disable_ipv6': value => '0' }
  sysctl::conf { 'net.ipv4.tcp_mtu_probing': value       => '1' }

我尝试过这种匹配模式( sysctl::conf \{.*\}\n{1,}),然后将其替换为\1\n sysctl::conf { 'net.ipv4.tcp_mtu_probing': value => '1' }

问题在于,反向引用引用的是每一行而不是所有分组的块,以在末尾添加我的新行。这是我得到的,而不是期望的结果:

  sysctl::conf { 'net.ipv4.neigh.default.gc_thresh1':  value => '4096' }
  sysctl::conf { 'net.ipv4.tcp_mtu_probing': value       => '1' }
  sysctl::conf { 'net.ipv4.neigh.default.gc_thresh2':  value => '8192' }
  sysctl::conf { 'net.ipv4.tcp_mtu_probing': value       => '1' }
  sysctl::conf { 'net.ipv4.neigh.default.gc_thresh3':  value => '16384' }
  sysctl::conf { 'net.ipv4.tcp_mtu_probing': value       => '1' }
  sysctl::conf { 'net.ipv6.conf.all.disable_ipv6':     value => '0' }
  sysctl::conf { 'net.ipv4.tcp_mtu_probing': value       => '1' }
  sysctl::conf { 'net.ipv6.conf.default.disable_ipv6': value => '0' }
  sysctl::conf { 'net.ipv4.tcp_mtu_probing': value       => '1' }

我应该尝试将整个行块匹配为一种模式,而不是同一模式的多次匹配吗?

之所以这样,是因为我正在使用Atom搜索和替换不相同的几个文件中的所有sysctl::conf条目,并将新条目添加到已经存在的文件之后。

谢谢:)

PS:已经知道在原子反向引用中称为$ 1而不是\ 1。

1 个答案:

答案 0 :(得分:0)

您可以尝试使用此模式

(?:\s*sysctl::conf \{.*\})+

之后用

替换
\0\n  sysctl::conf { 'net.ipv4.tcp_mtu_probing': value       => '1' }

请注意\0,因为没有任何捕获组。

说明:

  • ?:是一个非捕获组,用于捕获孔块(即\0)。
  • \s*匹配任何空白字符(等于[\ r \ n \ t \ f \ v])。
  • +最后捕获所有匹配项。