패턴 블록의 각 라인을 EOL로 교체

패턴 블록의 각 라인을 EOL로 교체

다음과 같은 텍스트 파일이 있습니다.

여기서 $는 EOL(줄 끝) 위치를 나타내며 이를 설명하는 데 사용됩니다.

 53t83t5  5 gejgi3 gg 4gij503 $

      /* rtdrfsetsrhs               $
ryhrdhrh               $
rhyrdhyyyyyyyyyyyrhyrshrh$
ryhrhrh */$
$
345dfeb terfgb$
/*srdtfgyhgfs*/           $
$
$

/* */이제 이 블록의 각 줄을 아래와 같이 줄의 시작 부분에 있는 EOL로 바꿔야 합니다 . $의 위치를 ​​참고하세요.3호선/*이는 공백을 포함하는 문자가 있는 경우 건너뛰지 말고 슬래시 대신 EOL을 입력해야 한다는 의미입니다.

 53t83t5  5 gejgi3 gg 4gij503 $

      $
$
$
$
$
345dfeb terfgb$
/*srdtfgyhgfs*/           $
$
$

전체 블록을 삭제하여 블록을 감지할 수 있지만 sed '/\/\*/,/\*\//d inputFile.sed 스크립트에서 sed 명령을 사용하여 위의 작업을 수행할 수 있는지 알고 싶습니다.

노트: /*...*/이것은 패턴 블록을 설명하는 데 사용되며, 예를 들어 다른 패턴을 포함하는 블록을 가질 수도 있습니다. <--...-->또는 !!...!!조각을 알고 싶지만 /*...*/다른 모든 것을 직접 처리할 수 있습니다.

답변1

예상 출력에서 ​​적어도 하나의 개행 문자가 포함된 블록에서 개행 문자를 제외한 모든 문자를 제거하려는 것 같습니다.

따라서 다음을 사용할 수 있습니다 perl.

perl -0777 -pe '
  s{/\* .*? \*/ | <-- .*? --> | !! .*? !!}{
    $& =~ /\n/ ? $& =~ s/[^\n]//gr : $&
  }gsex' < your-file

답변2

반드시 그래야 하는 경우 sed다음 스크립트는 예제에서 수행하는 작업을 수행합니다.

#!/usr/bin/sed -f

# if line contains "/*" we enter our "within-patterns" code-block
/\/\*/{
# however, lines must also _not_ contain "*/",
# because our specs wants us to leave those lines as is
    /\*\//!{
# first line within patterns, delete everything after the "/*"
        s%/\*.*%%
# this is a label to be used by "goto" (sed's 'b' command)
        :block
# display current line and read next one
        n
# if line just read does _not_ have "*/" end-of-block
        /\*\//!{
# delete whole line and
            s/.*//
# "goto" label "block" above
            bblock
        }
# we get here if current line _does_ contain "*/" end-of-block,
# in which case we delete everything up to the "*/"
        s%.*\*/%%
# then exit our "within-patterns" code-block.
    }
}

접근 방식은 스크립트가 자동으로 실행되도록 하는 대신 "블록 내" 모드에서 루프 제어를 유지하도록 하는 것입니다 sed. 이런 방식으로 우리는 블록 내 라인의 작동을 미세 조정할 수 있습니다.

하지만 이는 교육 목적으로만 사용되었으므로 소개하겠습니다.조금더욱 발전된 sed건설. 이 스크립트는 실제 C/XML/HTML/모든 소스 파일의 주석 행을 구문 분석하는 데 전적으로 적합하지 않습니다. 이러한 파일은 일반적으로 예제 시나리오보다 훨씬 복잡하기 때문입니다. 예를 들어 참조하십시오.더 많은 통찰력을 얻으려면 이 Q&A를 참조하세요..

관련 정보