#include "a.h"를 #include <a.h>로 바꾸는 정규표현식이 뭘까요?

gurugio의 이미지

여러 파일이 #include "~~.h"라고 ""를 써서 헤더를 참조하고 있습니다.
헤더 파일도 여러개가 있구요.
이것들을 <~~.h>로 바꾸고 싶은데 정규 표현식으로 어떻게 해야될까요?

제 생각에 #include "\(*\)" 로 검색하면 될까 했는데 잘 안되네요.
또 검색도 문제지만 수정은 어떻게 해야할지 모르겠습니다.

dbdan의 이미지

iamroot.org

dbdan의 이미지

"#include"([\t ]+)(\")([a-zA-Z0-9.]+)(\")([\t ]*)\n

gurugio의 이미지


감사합니다. 그냥 *만 하는게 아니었네요 ;-)

그런데 검색은 됩니다만 대체할 텍스트를 어떻게 입력해야 할까요?

----
섬기며 사랑하면 더 행복해집니다.
나불나불 블로그 - http://gurugio.blogspot.com/
몸에 좋은 칼슘이 듬뿍담긴 OS 프로젝트 - 칼슘OS http://code.google.com/p/caoskernel/

dbdan의 이미지

ㅈㅅ합니다.
정규표현식으로 검색하셔서 c같은 언어로 치환하시는줄 알고 적엇는데
지금 lex 책이 없어서 기억이 나는대로만 적엇기 때문에 더 적을 수는 없어요

acroedit 정규표현식으로는
"#include"([\t ]+)(\")([a-zA-Z0-9.]+)(\")([\t ]*)\n
"#include"$1<$3>$5\n
이군요

([a-zA-Z0-9.]+)를 unsouled님처럼 (.+)나 ([^\n]+)로 바꾸어도 된답니다.

unsouled의 이미지

루비로 간단히 현재 디렉토리 내의 *.c 에서 #include "~~.h" 를 #include <~~.h> 로 바꾸는 스크립트 짜봤습니다.

실행시켜보려면 기존 소스 백업 하시고 실행해 보세요.

잘못돼서 소스 날려도 책임은 못집니다;;

entries = Dir.entries(".").find_all { |e| e.match /\.c$/ }
entries.each do |e|
  file = File.open(e)
  source = file.read
  File.open(file, 'w+') { |f| f << source.gsub(/#include \"(.*?)\"/, '#include <\1>') }
end
gurugio의 이미지

감사합니다.
루비가 좋긴 좋네요.

----
섬기며 사랑하면 더 행복해집니다.
나불나불 블로그 - http://gurugio.blogspot.com/
몸에 좋은 칼슘이 듬뿍담긴 OS 프로젝트 - 칼슘OS http://code.google.com/p/caoskernel/

snowall의 이미지

저라면 거의 대부분의 편집기에 있는 "찾아 바꾸기"기능을 이용해서

#include" -> #include<

.h" -> .h>

이렇게 두번에 걸쳐서 작업을 할 것 같습니다. notepad++에는 파일 여러개를 지정해서 그 파일들에 대해 찾아바꾸기를 해주는 기능도 있지요. 정규식을 잘 몰라서 그냥 적당히...-_-;

--------------------------
피할 수 있을때 즐겨라!
http://snowall.tistory.com

피할 수 있을때 즐겨라! http://melotopia.net/b

mrjh76의 이미지

저라도 이렇게 할 것 같습니다.

일을 꼭 폼나게 할 필요는 없다고 보는데...

raymundo의 이미지

뭐 본문 쓰신 분이 이미 해결하셨다지만...

저렇게 두 번 바꾸는게 그냥 눈으로 보면서 처리할 때는 상관이 없는데, 다수의 파일, 그 안에 수백 수천개의 라인이 있을때는,

printf("see readme.h");

이런 걸 다 치환해버리니 와르르 컴파일 에러가 나겠죠.

뭐 지금같은 경우는 위의 예는 좀 어거지 같기도 하고 ^^; 또 정규식을 쓰더라도 여전히 이렇게 바꾸면 안 될 곳을 바꾸는 위험은 존재합니다만, 가능성을 줄일 수 있으면 줄이는 게 좋을테니까요.

좋은 하루 되세요!

raymundo의 이미지

vim 에서는

:1,$s/^\#include\s*"\(.*\.h\)"/#include <\1>/g

정도로 치환하시면 되겠네요.

파일이 다수라면, 이 치환을 명령행 인자로 주어서 vim 을 돌리면 되겠죠.

$ vim -c '1,$s/^\#include\s*\"\(.*\.h\)\"/#include <\1>/g' -c 'wq' 파일1.c

이걸 각 파일에 대해 돌리면 되니까 리눅스 bash 쉘이라면
$ for FILE in *.c
> do
> vim -c '1,$s/^\#include\s*\"\(.*\.h\)\"/#include <\1>/g' -c 'wq' $FILE
> done

vim 자체에 인자로 다수의 파일 이름을 줘서 일괄적용시킬 수도 있긴 있을 것 같은데 방법을 저는 모르겠네요.

아시겠지만, 이런 건 적당한 가정 (#include 문은 항상 라인 제일 앞에 공백 없이 바로 쓰인다거나)이 들어간 거라서... 그래도 나중에 diff 를 돌리거나 해서 검사는 하셔야 할 듯 합니다.

좋은 하루 되세요!

gurugio의 이미지

도움 감사합니다.

결국 이렇게 처리했습니다. 이맥스에서 되는 것이고, 다른 에디터는 조금씩 다를것 같습니다.

#include "\(.+\)" ===> #include <\1>

----
섬기며 사랑하면 더 행복해집니다.
나불나불 블로그 - http://gurugio.blogspot.com/
몸에 좋은 칼슘이 듬뿍담긴 OS 프로젝트 - 칼슘OS http://code.google.com/p/caoskernel/

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.