다음으로 시작하는 파일이 있다고 가정해 보겠습니다.
/*********************************************************
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