次のような「test」ファイルがあります。
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>
m「IPS」をn「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/
最後のアドレス一致に依存します。これは行われます。が/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