다음과 같은 텍스트 파일이 있습니다.
여기서 $는 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를 참조하세요..