2012-05-11 2 views
0

패치 파일에서 C 주석을 제거하고 수많은 정규식을 조사했지만 패치에서 줄을 제거하면 손상 될 수 있습니다.패치 파일에서 C 주석을 제거하는 방법

diff 패치 파일에서 주석을 검색하고 주석 행을 공백으로 바꾸려면 regex 또는 sed 명령을 어떻게 작성합니까?

이 C 파일을 나오지 정규식 작품을 작동하지만 패치를 나는 다른 무언가가 필요합니다

sed '/^\/\*/,/\*\//d' 

예 패치 exerpt은 다음과 같습니다

@@ -382,7 +391,109 @@ 
     return len; 
} 

+/********************************************************************************** 
+ * Some patch 
+ * Author: Mcdoomington 
+ * Do somethimg 
+ * 
+ * fix me 
+ **********************************************************************************/ 

누구나 아이디어를 가지고 있습니까?

편집 : 라인을 건너 \로 끝나면 나는를 추가하려면 어떻게

sed -e 's,^+ \*.*,+ \/\/Comment removed,' mypatch.patch > output 


+/********************************************************************************** 
+ //Comment removed 
+ //Comment removed 
+ //Comment removed 

:

이 필터를 사용하십니까?

편집 :없는 가장 깨끗한 방법이 있지만 솔루션

- 나는 엉터리 정규식에 나오지도 사용됩니다.

참고 두 번째 명령은 약간 욕심이 많을 수 있지만 주석을 살핍니다.

원리 :이 코멘트의 끝인지

1) 첫 번째 명령 결정하려면/[^ * /]가 /후 {N이면/결정 $, S^+ \ *., +/* 주석이 제거되었지만 ;;} '이 (가) + * 무엇이든 찾아내어 * 주석을 제거했습니다.

2.) 두 번째 명령 이것이/[^ * /] $ /의 끝인지 여부를 확인하려면 /then {N; s,^+ \ *인지 확인하십시오., +/* 주석이 제거되었지만 ;;} '이 (가) + * 무엇이든 찾아내어 * 주석을 제거했습니다.

+0

패치 파일을 수신합니까? 아니면 생성하고 있습니까? 모든 주석은 이동할 것인지 아니면 함수 간의 주석을 그냥 차단합니까? –

+0

패치 파일이 이미 만들어졌으며 주석을 제거하거나 적어도 비워 두는 쉬운 방법을 찾고있었습니다. 새로운 패치를 만드는 것은 스테이징 환경으로 인해 거대한 작업이며 대략 30 + 이상입니다. – mcdoomington

+1

regexes가 단순히 스마트하지 않거나 원하는대로 작업 할 수있는 유연성이없는 지점이 있습니다. 이 경우 중 하나입니다. '/ *','* /','//'토큰을 인식하고 그에 따라 파일을 파싱 할 수 있어야합니다. 개인적으로, 나는이 일을 위해 필자 자신의 필터를 손으로 직접 해킹했다. 몇 시간이 걸리지 않아야합니다. –

답변

1

난 그냥

를 사용하여 의견의 대부분을 통조림 신속하고 더러운 hackjob을 사용 *의 순서를 찾을 때까지 단 1 문자 단위로 읽기 (그것을 출력하지 않음)
sed -e '/[^\*\/]$/{N;s,^+ \* .*,+ \* Comment removed,;}' patch > output 
sed -e '/[^\*\/]$/{N;s,^+\\\* .*,+ \/\* Comment removed,;}' patch > output 
1

정규 표현식은 훌륭하지만 훌륭하지는 않습니다.

패치를 만들기 전에 주석을 제거합니다.

이렇게 할 수 없다면 패치를 적용 할 것입니다. 패치 된 파일과 패치되지 않은 파일의 주석을 모두 제거한 다음 패치를 다시 만듭니다.

그래서 x.h로 시작하는 우리는 x1.h을 편집하고 패치를 만들 :

diff -u x.h x1.h > patch 

그런 다음 우리가 누군가에 패치를 게시 x.h.있다

cp x.h xnc.h 
sed -e '/^\/\*/,/\*\//d' -i xnc.h 
patch x.h patch 
cp x.h xnc2.h 
sed -e '/^\/\*/,/\*\//d' -i xnc2.h 
diff -u xnc.h xnc2.h > patchnc 

은 주석이없는 패치를 만들어야합니다.내가 패치 후

find unpatched -exec sed -e ':^/\*:,:\*/:d' -i "{}" \; 
find patched -exec sed -e ':^/\*:,:\*/:d' -i "{}" \; 
diff -urN unpatched patched > patch 
+0

이것은 불행히도 시간이 많이 소요되는 프로세스입니다. 최소한이 부분을 자동화 할 수있는 방법을 알고 있습니까? – mcdoomington

+0

스크립트를 작성할 수 있어야합니다. 패치를 만들기 전에 해보십시오. – Julian

+1

@mcdoomington : 모든 주석을 제거했는지, 아니면 패치에 표시된 주석 만 제거 하시겠습니까? 블록 주석의 일부분에만 영향을 미치는 패치에 대해 당신은 무엇을하고 싶습니까? C 주석 스트리퍼 프로그램이 있습니다 (필자가 작성한 부부가 있는데, 나는 그와 같은 유일한 사람이 아닙니다), 패치 생성 프로세스를 수정하여 이전 소스와 새로운 소스가 없도록했습니다. 패치가 작성되기 전에 원하지 않는 주석이 작성됩니다. –

0

패치되지 않은 소스 나무, 경우

하지만 정규 표현식을 사용하지 않을 것입니다. 일반적으로 그들은 라인 내에서 작동합니다. 그리고 파일에는 여러 행에 걸쳐 주석이 있습니다.

C/C++ 또는 Java로 간단한 파서를 작성합니다.

시작 상태 0이

당신까지 문자 (출력한다)에 의한 상태 0 방금 읽은 문자에서 그런 상태에서 상태 1.

로 전환/*

의 순서를 찾을 수 당신은/

관련 문제