gvim 문자열 검색 및 치환

dcmru의 이미지

안녕하세요. 찾다찾다 kldp까지 왔군요.
알바하는 곳 윈도우2000 서버가 ms sql을 사용하는데, 취약점을 이용하여 중국에서 해킹을 시도하여
asp, htm, html 파일에 죄다 iframe구문을 삽입해놨네요.
백업해놓은 것으로 거의 마무리 지었으나 백업을 해놓지 않은 파일의 htm파일 등 몇 천개가 됩니다.
일일이 열어서 수정할려니 머리에 쥐가 나고 팔이 절여 어떻게 하면 간편하게 할까 생각하다,
윈도우용 gvim을 사용하면 되겠다는 생각까지 왔습니다. vi도 기초적인 부분만 사용 가능한 상태입니다. 하여 검색을 해보니

vim -c "argdo %s/ABC/DEF/g | w" *.txt 이런 부분을 찾게 되었는데요.

저명령어에서 ABC부분을 <iframe>~~~</iframe>로 바꾸고 DEF 부분을 공백으로 줄려고 합니다.
그리고 *.txt를 *.htm으로 바꾸면 특정 디렉터리 상관 없이 다 검색하여 치환이 될까요?
몇시간 검색만 하다가 글을 적을려니 정리가 안되네요.

요점은 윈도우상에서 gvim을 이용하여 디렉토리 내의 모든 *.htm파일을 찾아
<iframe>~~~</iframe> 부분을 공백으로 바꿀려고 합니다. 명령어를 살펴보고 있는데 바로 적용할려니 막막합니다.
cmd 상에서 어떤 명령어를 줘야할까요?

elien의 이미지

그렇습니다. 다음과 같은 명령을 사용하면 가능합니다.
$ vim -c "argdo %s,<iframe>\_.*</iframe>,,g | w" *.htm
하지만 *.htm 파일 내의 모든 iframe 태그부분이 사라지게 되므로, 원본에서 iframe 태그를 사용하지 않았을 경우에만 도움이 되겠지요.
윈도우즈 상에서 vim 을 이용하여 하위 디렉토리까지 한 번에 해결하는 것은 잘 모르겠네요. 저라면 perl 이나 cygwin bash 등을 써서 하겠지만...

아울러 위 명령은 잘못 사용했을 경우 복구가 되지 않습니다. 가급적 현재의 파일들이라도 백업한 후에 도전하세요 :)

훗, 못 믿겠나?

지리즈의 이미지

저는 perl을 주로 애용하는데,

저 vim 명령은 reclusive한 가요?

There is no spoon. Neo from the Matrix 1999.

익명 사용자의 이미지

elien wrote:
$ vim -c "argdo %s,<iframe>\_.*</iframe>,,g | w" *.htm
하지만 *.htm 파일 내의 모든 iframe 태그부분이 사라지게 되므로, 원본에서 iframe 태그를 사용하지 않았을 경우에만 도움이 되겠지요.
윈도우즈 상에서 vim 을 이용하여 하위 디렉토리까지 한 번에 해결하는 것은 잘 모르겠네요. 저라면 perl 이나 cygwin bash 등을 써서 하겠지만...

아울러 위 명령은 잘못 사용했을 경우 복구가 되지 않습니다. 가급적 현재의 파일들이라도 백업한 후에 도전하세요 :)

저기서 <iframe>\_.*</iframe> 이부분이 똑같습니다. 하여 예를들면 <iframe src="http://test.com/default.htm"></iframe> 인데요.
이 것을 그대로 쓰면 <iframe src="http://test.com/default.htm"></iframe>만 공백으로 바뀐다는 것이지요?

하위 디렉토리까지 안바뀐다면 다른 방법도 찾아 봐야겠네요. 오늘 일일이 열어서 수정했다가 손가락 부러지는줄 알았습니다. ㅠㅠ

익명 사용자의 이미지

에딧플러스, 울투라에딧 모두 정규화표현식 치환을 지원합니다.

elien의 이미지

recursive 하지 않습니다. vim 옵션에는 없는 것으로 보입니다.
리눅스 셸이라면 파이프를 쓴다던지 해서 어떻게 해보겠습니다만, 윈도 명령줄로는... :cry:

대신 윈도탐색기의 '검색' 기능을 이용해서 비슷하게 할 수 있겠네요.
내용검색으로 'iframe' 을 찾되 하위디렉토리까지 검색하도록 하고,
그렇게 검색된 파일들을 하나의 gvim 창으로 연 다음,
gvim 내의 커맨드 모드에서
:bufdo %s,.....
와 같이 하시면 됩니다. (:help bufdo, :help argdo)

위와 같이 파라미터가 붙는 경우엔 %s,<iframe\_.*</iframe>,,g 와 같이 해야겠지요.

아, 깜빡하고 빼먹을 뻔 했네요. (아주 중요합니다 :!: )
vim 에서 '\_.' 문자의 경우 newline 을 포함한 모든 캐릭터에 대응됩니다.
또 *와 같이 와일드 카드를 이용하여 검색하는 경우, 파일의 뒤쪽에서부터 검색해오는 것으로 보이는데요,
만약 "<iframe>...</iframe>" 과 같은 것이 하나의 파일에 '둘 이상' 존재하는 경우, 위에 적어둔 명령은 사용할 수 없습니다.
최초의 <iframe> 에서부터 최후의 </iframe> 사이의 모든 것이 다 지워지게 되거든요 -_-;

(vim 에서 아주 불가능한 것은 아닙니다. 스크립트를 만들어서 할 수는 있습니다만, 한 줄 명령으로는 힘들 것 같네요~)

훗, 못 믿겠나?

dcmru의 이미지

울트라 에디트나 에디트 플러스에서도 Replace in Files가 된다고 하여 찾다 보니
Replace in Files 이 기능만 구현된 프로그램을 찾았습니다. 한 번 해봐야겠습니다. ^^

노력만이 살길이다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.