如何用 n 部分线替换 m 部分线?

Nid*_*dal 5 grep sed awk text-processing

我有一个像这样的文件“测试”:

RewiteEngine On
RewriteCond   %{REMOTE_ADDR}   !^192\.168\.1\.7$  [NC]
RewriteCond   %{REMOTE_ADDR}   !^192\.168\.1\.8$  [NC]
RewriteCond   %{REMOTE_ADDR}   !^192\.168\.1\.9$  [NC]
RewriteCond   %{REMOTE_ADDR}   ^192\.168\.1\.5$  [NC]
</Directory>
Run Code Online (Sandbox Code Playgroud)

我想更换\.1\.7\.1\.8\.1\.9通过\.1\.10所以这将是:

RewiteEngine On
RewriteCond   %{REMOTE_ADDR}   !^192\.168\.1\.10$  [NC]
RewriteCond   %{REMOTE_ADDR}   ^192\.168\.1\.5$  [NC]
</Directory>
Run Code Online (Sandbox Code Playgroud)

它可能是用 n 个“IPS”替换 m“IPS”,我怎样才能达到这个目的?

cuo*_*glm 4

一个perl办法:

$ perl -ple 's/\\\.1\\\.(7|8|9)/\\.1\\.10/' file | uniq
RewiteEngine On
RewriteCond   %{REMOTE_ADDR}   !^192\.168\.1\.10$  [NC]
RewriteCond   %{REMOTE_ADDR}   ^192\.168\.1\.5$  [NC]
</Directory>
Run Code Online (Sandbox Code Playgroud)

如果你想就地编辑,你可以尝试:

perl -i.bak -nle 'next if $count and /!\^/;s/\\\.1\\\.(7|8|9)/\\.1\\.10/ and $count++ if /!\^/;print' file
Run Code Online (Sandbox Code Playgroud)