SED를 사용하여 댓글 섹션의 댓글을 바꾸는 방법

SED를 사용하여 댓글 섹션의 댓글을 바꾸는 방법

다음으로 시작하는 파일이 있다고 가정해 보겠습니다.

    /*********************************************************
    blah blah blah
    blah blah blah
    blah blah blah
    *********************************************************/
    Actual code follows here
    code 
    code 
    code

내가 사용한 명령은 다음과 같습니다.

    sed -i 's/(/*).*(*/)/\1 newcomment \2/1' file

하지만 오류 메시지가 나타났습니다.

    sed: -e expression #1, char 14: unknown option to `s'

PS 제 질문은... "어쩌고 저쩌고..." 댓글을 다른 블로아 블로아 블로아 댓글로 어떻게 바꿀 수 있나요?

답변1

다음을 사용하면 더 쉽습니다 perl.

perl -0777 -pi -e 's{/\*.*?\*/}{/* new comment */}s' file.c

/*...*/새 주석의 첫 번째 항목이 대체됩니다.

sed-z한 번에 한 줄씩 텍스트를 처리하므로 패턴 공간에 추가 줄을 추가하지 않는 한(또는 최신 버전의 GUN 을 사용하여 sed) 여러 줄의 텍스트를 일치시킬 수 없습니다 .

sed -zi 's|/\*.*\*/|/* new comment */|' file.c

또는 이식 가능(짧은 파일로 가정):

sed -e :1 -e '$!{N;b1' -e '}' -e 's|/\*.*\*/|/* new comment */|' file.c

하지만 탐욕스럽지 않은 연산자는 sed지원되지 않으므로 첫 번째 발생 부터 시작하여*?perl/*마지막발생하므로 로 */대체됩니다 ./* comment 1 */ some C code /* comment 2 *//* new comment */

이렇게 하는 sed것은 가능 하지만 더 고통스러울 것입니다. 바라보다여기예를 들어 (이것은 /*내부 발생 "strings"및 기타 경고도 방지합니다).

이 솔루션에 해당하는 단순화된 내용 perl은 다음과 같습니다.

sed '
  # load the whole file into the pattern space
  :1
  $!{
    N;b1
  }
  s/_/_u/g;s/>/_c/g; # use _ as an escape character to escape
                     # the > we will be using in place of */
  s|\*/|>|g; # replace */ with >
  s|/\*[^>]*>|/* new comment */|
  s|>|*/|g; # undo the replacement and escaping
  s/>/_c/g;s/_u/_/g' file.c

GNU를 사용하면 awk다음과 같은 작업을 수행할 수 있습니다.

awk -v RS='\\*/' '
  !found && sub(/\/\*.*/, "/* new comment ") {found = 1}
  {printf "%s", $0 RT}' file.c

답변2

이스케이프 괄호 및 슬래시

 sed -i 's/\(\/*\).*\(*\/\)/\1 newcomment \2/1' file

관련 정보