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

관련 정보