if - sed의 경우 문자열을 생략하면서 두 문자열 사이의 문자열을 제거해 보세요.

if - sed의 경우 문자열을 생략하면서 두 문자열 사이의 문자열을 제거해 보세요.

문자열 끝과 문자 ; 사이에 있는 문자열을 제거하려고 할 때 문제가 발생합니다. 현재는 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

  1. 첫 번째 시도에서 문법 replacement부분을 놓쳤습니다 s/pattern/replacement/modifiers.

  2. 닫는 괄호를 이스케이프 처리하는 것을 잊었습니다. 를 사용하세요 \).

  3. 하지만 세미콜론을 피할 필요는 없습니다.

  4. 귀하의 패턴에는 모든 항목이 포함되어 있으므로 end.*;모두 제거됩니다. \1;대체품 으로 사용됩니다 .

총:

sed -i -e '/if/!s/\(end\).*;/\1;/' file

또는 end정적 단어와 .*가 포함되어 ;단순화할 수 있습니다.

sed -i -e '/if/!s/end.*/end;/' file

관련 정보