匹配 n 次后使用正则表达式反向引用
Using regex backreference after matching n times
我需要在人偶定义中匹配多个字符串:
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,})
然后用 \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: 已经知道在 atom 中反向引用被称为 $1 而不是 \1。
你可以试试这个模式
(?:\s*sysctl::conf \{.*\})+
之后替换为
[=11=]\n sysctl::conf { 'net.ipv4.tcp_mtu_probing': value => '1' }
注意 [=12=]
,因为没有任何捕获组。
解释:
?:
是一个Non-capturing group来捕获空位块(即[=12=]
)。
\s*
匹配任何空白字符(等于 [\r\n\t\f\v ])。
+
最后捕获所有匹配项。
我需要在人偶定义中匹配多个字符串:
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,})
然后用 \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: 已经知道在 atom 中反向引用被称为 $1 而不是 \1。
你可以试试这个模式
(?:\s*sysctl::conf \{.*\})+
之后替换为
[=11=]\n sysctl::conf { 'net.ipv4.tcp_mtu_probing': value => '1' }
注意 [=12=]
,因为没有任何捕获组。
解释:
?:
是一个Non-capturing group来捕获空位块(即[=12=]
)。\s*
匹配任何空白字符(等于 [\r\n\t\f\v ])。+
最后捕获所有匹配项。