스크립트 대신 SED 명령을 사용하는 솔루션

스크립트 대신 SED 명령을 사용하는 솔루션

시도했지만 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 */-1while(주석을 제거하면 얻을 수 있음)과 같은 구문 분석은 오류를 발생시킵니다). 주석을 완전히 제거하는 것보다 (여기에서 했던 것처럼) 공백 문자로 바꾸는 것이 더 낫습니다.1 - -11--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기준을 지정(예: 옵션 추가)하지 않으면 작동하지 않습니다.gccgcc -std=c99gcc -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 배포판에서는 작동합니다.

관련 정보