m個の行部分をn個の行部分に置き換えるには?

m個の行部分をn個の行部分に置き換えるには?

次のような「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

関連情報