我有一个像这样的文件“测试”:
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>
我想替换\.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>
它可能是用n“IPS”替换m“IPS”,我怎样才能达到这个目的?
答案1
一个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>
如果你想就地编辑,你可以尝试:
perl -i.bak -nle 'next if $count and /!\^/;s/\\\.1\\\.(7|8|9)/\\.1\\.10/ and $count++ if /!\^/;print' file
答案2
我已经设法通过删除所有行并重新插入它们来做到这一点,但我想要一个最佳解决方案(因为这里删除整行然后添加新的整行)并且我想向添加的行添加空格:
删除:
sed -i '/!^.*$/d' test2
插入回:
sed -i '/RewiteEngine On/aRewriteCond %{REMOTE_ADDR} !^192\.168\.1\.10$ [NC]' test2
输出是:
RewiteEngine On
RewriteCond %{REMOTE_ADDR} !^192.168.1.10$ [NC] # need whites spaces at the begining
RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.5$ [NC]
答案3
sed '/!/d;/\(\^[^5]*\)./{h;s//!\110/p;g;}' <<\DATA
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>
DATA
输出
RewiteEngine On
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.10$ [NC]
RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.5$ [NC]
</Directory>
所以这依赖于s/ubsti/tution/
最后一个地址的匹配 - 它会这样做。当 an/address/
为空时,如s//
或 则//
隐含前一个地址。它删除所有/!/
包含感叹号的行,然后寻址带有 a 的行^
并将其放入保留空间。然后它对其进行编辑、p
打印,并再次覆盖它,其原始值仍保留在h
旧空间中。
但如果匹配地址可以匹配h
旧行和编辑过的行,然后您可以继续编辑它们。也许是这样的:
sed '/!/d;/\(\^[^$]*\.\)[0-9]*/{h;s//!\110/p;s//\111/p;s//\112/p;g;}' <<\DATA
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>
DATA
输出
RewiteEngine On
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.10$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.11$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.12$ [NC]
RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.5$ [NC]
</Directory>
但老实说,除此之外,您可能会想以不同的方式处理它。也许与printf
?
ips() { printf 's//\\1%d/p;' $(seq "$@") ; echo 'g;}' ; }
sed '/!/d;/\(\^[^$]*\.\)[0-9]*/{h;s//!\110/p;'"$(ips 11 30)" <<\DATA
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>
DATA
输出
RewiteEngine On
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.10$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.11$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.12$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.13$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.14$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.15$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.16$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.17$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.18$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.19$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.20$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.21$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.22$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.23$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.24$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.25$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.26$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.27$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.28$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.29$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.30$ [NC]
RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.5$ [NC]
</Directory>
答案4
一种方式gawk
:
awk '{gsub(/\.[7-9]\$/,"\.10$")}!a[$0]++' test