grep과 sed를 이용한 다수 파일 내 문자열 치환

별건 아니지만, 이런 명령어는 자주 안쓰면 까먹기 떄문에 메모차 작성해둡니다.

요약

grep "찾을 문자열" * -rl | xargs sed -i 's/찾을 문자열/바꿀 문자열/g'

History..

Mad metasploit을 msf 적용 후 로드 시 Metasploit3~4 어쩌고 저쩌고 하는 모듈 워닝이 발생하는데, 이는 레거시 코드(바뀐지 그리 오래된 것 같진 않음..)로 인해 발생하는 오류였습니다. Metasploit3 Metasploit4 라는 이름의 class 사용이 금지된건데, 이는 MetasploitModule 이라는 클래스 명으로 전환하여 코드를 재사용할 수 있어 grep 과 sed로 치환하여 사용했습니다.

우선 문제가 발생한 코드들을 보면… 어마어마하게 많았고

grep "Metasploit3" * -R
auxiliary/scanner/http/fingerprint.rb:class Metasploit3 < Msf::Auxiliary
auxiliary/securestate/proxy_config.rb:class Metasploit3 < Msf::Auxiliary
auxiliary/securestate/owa_login.rb:class Metasploit3 < Msf::Auxiliary
auxiliary/securestate/cdp.rb:class Metasploit3 < Msf::Auxiliary
auxiliary/capture/mdns_collector.rb:class Metasploit3 < Msf::Auxiliary
auxiliary/bruteforce/eap_md5_dict.rb:class Metasploit3 < Msf::Auxil
....

-ㅣ 옵션을 주면 해당 경로만 찾아낼 수 있는데,

grep "Metasploit3" * -rl
auxiliary/scanner/http/fingerprint.rb
auxiliary/securestate/proxy_config.rb
auxiliary/securestate/owa_login.rb

이걸 xargs로 sed에게 전달하고 치환시키면 됩니다(sed 방법은 vim 내부에서도 쓰이는 방법이죠)

grep "Metasploit3" * -rl | xargs sed -i 's/Metasploit3/MetasploitModule/g'
grep "Metasploit4" * -rl | xargs sed -i 's/Metasploit4/MetasploitModule/g'