시도했지만 sed
관련 문자가 이미 명령에 구분 기호로 포함되어 있기 awk
때문에 작동하지 않습니다 ./
이를 달성하는 방법을 알려주십시오.
여기에 예가 있습니다. 우리는 주석 부분을 제거하고 싶습니다./*.....*/
/*This is to print the output
data*/
proc print data=sashelp.cars;
run;
/*Creating dataset*/
data abc;
set xyz;
run;
답변1
간단한 해결책을 찾은 것 같아요!
cpp -P yourcommentedfile.txt
일부 업데이트:
사용자의 인용문이르카초(네티즌 댓글의 원문):
나는 gcc 옵션을 가지고 놀았습니다.-f 전처리대부분의 지시문과 매크로 확장은 비활성화됩니다(#define 및 #undef는 제외). 다음에 추가-dD정의도 남습니다.표준=c89// 새 스타일 주석을 무시하는 데 사용할 수 있습니다. 존재하더라도 cpp는 주석을 공백으로 대체하고(제거하는 대신) 공백과 빈 줄을 축소합니다.
하지만 이는 대부분의 경우 여전히 합리적이고 간단한 해결책이라고 생각하며, 매크로 확장 및 기타 사항을 비활성화하면 좋은 결과를 얻을 수 있다고 생각합니다... - 예, 더 나은 결과를 위해 쉘 스크립트와 결합할 수 있습니다. ..그리고 더...
답변2
한번 알아봤는데이것이를 다음과 같이 세분화할 수 있습니다.
perl -0777 -pe '
s{
# /* ... */ C comments
/ (?<lc> # line continuation
(?<bs> # backslash in its regular or trigraph form
\\ | \?\?/
)
(?: \n | \r\n?) # handling LF, CR and CRLF line delimiters
)* \* .*? \* (?&lc)* /
| / (?&lc)* / (?:(?&lc) | [^\r\n])* # // C++/C99 comments
| (?<code> # tokenising anything else
"(?:(?&bs)(?&lc)*.|.)*?" # "strings" literals
| '\''(?&lc)*(?:(?&bs)(?&lc)*(?:\?\?.|.))?(?:\?\?.|.)*?'\'' # (w)char literals
| \?\?'\'' # trigraph form of ^
| .[^'\''"/?]* # anything else
)
}{$+{code} eq "" ? " " : $+{code}}exsg'
더 많은 코너 케이스를 처리합니다.
당신이제거하다주석, 코드의 의미를 변경할 수 있습니다( 1-/* comment */-1
while(주석을 제거하면 얻을 수 있음)과 같은 구문 분석은 오류를 발생시킵니다). 주석을 완전히 제거하는 것보다 (여기에서 했던 것처럼) 공백 문자로 바꾸는 것이 더 낫습니다.1 - -1
1--1
위의 코드는 이 유효한 ANSI C 코드에서 제대로 작동해야 합니다. 예를 들어 다음과 같은 특수한 경우를 포함해 보세요.
#include <stdio.h> 정수 메인() { printf("%d %s %c%c%c%c%c %s %s %d\n", 1-/* 설명*/-1, /\ * 논평*/ "/* 코멘트가 아님*/", /* 여러 줄 논평*/ '"' /* 논평*/ , '"', '\'','"'/* 논평*/, '\ \ "', /* 논평*/ "\ " /* 코멘트가 아님 */ ", "??/" /* 코멘트가 아님*/ ", '??''+'"' /* "주석" */); 0을 반환합니다. }
그러면 다음과 같은 출력이 제공됩니다.
#include <stdio.h> 정수 메인() { printf("%d %s %c%c%c%c%c %s %s %d\n", 1- -1, "/* 코멘트가 아님*/", ''', ''', '\'','"', '\ \ "', "\ " /* 코멘트가 아님 */ ", "??/" /* 코멘트가 아님*/ ", '??''+'"'); 0을 반환합니다. }
컴파일하고 실행할 때 둘 다 동일한 출력을 인쇄합니다.
의 출력과 비교하여 gcc -ansi -E
전처리기가 어떤 작업을 수행하는지 확인할 수 있습니다. 이 코드는 유효한 C99 또는 C11 코드이기도 하지만 세 글자 지원은 기본적으로 비활성화되어 있으므로 gcc
기준을 지정(예: 옵션 추가)하지 않으면 작동하지 않습니다.gcc
gcc -std=c99
gcc -std=c11
-trigraphs
또한 다음 C99/C11(비ANSI/C90) 코드에서도 작동합니다.
// 논평 /\ / 논평 // 여러 줄\ 논평 "//댓글이 아닙니다."
( gcc -E
// 와 비교 gcc -std=c99 -E
)gcc -std=c11 -E
ANSI C는 주석을 지원하지 않습니다 // form
. //
ANSI C에서는 효과가 없으므로 거기에 나타나지 않습니다. ANSI C에서 실제로 발생할 수 있는 인공적인 경우 //
(앞서 언급한 바와 같이)거기, 나머지 토론이 흥미로울 수 있습니다.)문자열화연산자를 사용 중입니다.
이것은 유효한 ANSI C 코드입니다.
#define s(x) #x
s(//not a comment)
그리고 2004년에 논의되었을 때 gcc -ansi -E
실제로 확장되었습니다 "//not a comment"
. 그러나 현재는 gcc-5.4
오류가 반환되므로 이 구성을 사용하는 C 코드를 많이 찾을 수 있을지 의문입니다.
GNU에 sed
해당하는 내용은 다음과 같습니다.
lc='([\\%]\n|[\\%]\r\n?)'
sed -zE "
s/_/_u/g;s/!/_b/g;s/</_l/g;s/>/_r/g;s/:/_c/g;s/;/_s/g;s/@/_a/g;s/%/_p/g;
s@\?\?/@%@g;s@/$lc*\*@:&@g;s@\*$lc*/@;&@g
s:/$lc*/:@&:g;s/\?\?'/!/g
s#:/$lc*\*[^;]*;\*$lc*/|@/$lc*/([\\\\%].|[^\\\\%\n\r])*|(\"($lc|[\\\\%]$lc*[^\r\n]|[^\\\\%\"])*\"|'$lc*([\\\\%]$lc*[^\r\n])?([^\\\\%']|$lc)*'|$lc|[^'\"@;:]+)#<\5>#g
s/<>/ /g;s/!/??'/g;s@%@??/@g;s/[<>@:;]//g
s/_p/%/g;s/_a/@/g;s/_s/;/g;s/_c/:/g;s/_r/>/g;s/_l/</g;s/_b/!/g;s/_u/_/g"
GNU가 너무 오래되어 or 를 sed
지원할 수 없는 경우 첫 번째 줄을 다음으로 바꿀 수 있습니다.-E
-z
sed -r ":1;\$!{N;b1}
답변3
그리고 sed
:
고쳐 쓰다
/\/\*/ {
/\*\// {
s/\/\*.*\*\///g;
b next
};
:loop;
/\*\//! {
N;
b loop
};
/\*\// {
s/\/\*.*\*\//\n/g
}
:next
}
모든 가능성을 지원합니다(여러 줄 주석, [or and] 뒤의 데이터).
e1/*comment*/
-------------------
e1/*comment*/e2
-------------------
/*comment*/e2
-------------------
e1/*com
ment*/
-------------------
e1/*com
ment*/e2
-------------------
/*com
ment*/e2
-------------------
e1/*com
1
2
ment*/
-------------------
e1/*com
1
2
ment*/e2
-------------------
/*com
1
2
ment*/e2
-------------------
달리기:
$ sed -f command.sed FILENAME
e1
-------------------
e1e2
-------------------
e2
-------------------
e1
-------------------
e1
e2
-------------------
e2
-------------------
e1
-------------------
e1
e2
-------------------
e2
-------------------
답변4
스크립트 대신 SED 명령을 사용하는 솔루션
당신을 위한:
sed 's/\*\//\n&/g' test | sed '/\/\*/,/\*\//d'
알아채다이것은 설치되어 있지 않으면 OS X에서는 작동하지 않습니다 gnu-sed
. 그러나 Linux 배포판에서는 작동합니다.