문자열 끝과 문자 ; 사이에 있는 문자열을 제거하려고 할 때 문제가 발생합니다. 현재는 end와 ; 사이에 있기 때문에 다른 줄에서도 문자열을 선택하는 것 같습니다. 명령에서 if 문자열을 생략하려고 시도했지만 오류가 발생하면 아래 sed 명령을 많이 사용하지 않는 것 같습니다. 문자열 트리거 이름은 제거해야 하는 이름이지만 일관되게 이름이 지정되지 않았습니다.
이전 예제 파일:
end if;
end triggername ;
예상되는 예제 파일:
end if;
end;
내가 사용하려고 했던 명령은 다음과 같습니다.
sed -i -e '/if/! s/\(end.*)\;/g' test
/만약/ 바랍니다! 다음 명령의 모든 리터럴 if 문자열은 생략되지만 실행하려고 하면 다음 오류가 발생합니다.
sed: -e expression #1, char 20: unterminated `s' command
이 오류가 발생하는 이유를 이해하도록 도와줄 수 있는 사람이 있나요? sed 명령이 기본적으로 정확하다면, 그렇지 않다면 어떻게 개선할 수 있는지 제안해 주시겠습니까?
업데이트 1:
감사합니다! 제안한 대로 /를 교체하는 대신 제거하도록 요청했기 때문에 끝에 /를 추가해 보았습니다. 하지만 이제 다음과 같은 오류가 발생했습니다.sed -i -e '/if/! s/\(end.*)\;//' test sed: -e expression #1, char 20: Unmatched ( or \(
나에게는 '\'에 대해 잘 모르는 닫는 괄호가 있는 것 같습니다. 아직 한 번밖에 만들어본 적이 없어서 굉장히 신선해요.
답변1
첫 번째 시도에서 문법
replacement
부분을 놓쳤습니다s/pattern/replacement/modifiers
.닫는 괄호를 이스케이프 처리하는 것을 잊었습니다. 를 사용하세요
\)
.하지만 세미콜론을 피할 필요는 없습니다.
귀하의 패턴에는 모든 항목이 포함되어 있으므로
end.*;
모두 제거됩니다.\1;
대체품 으로 사용됩니다 .
총:
sed -i -e '/if/!s/\(end\).*;/\1;/' file
또는 end
정적 단어와 .*가 포함되어 ;
단순화할 수 있습니다.
sed -i -e '/if/!s/end.*/end;/' file