sed가 내가 요청한 것보다 더 많은 일을 하는 이유는 무엇입니까?

sed가 내가 요청한 것보다 더 많은 일을 하는 이유는 무엇입니까?

sed -i -e "s/..\///" -e "s/type_properties\///" testfile다음 파일에 적용할 때 :

#include "../../../../include/concepts/type_properties/operations/has_or_op_v.hpp"

int main() {
    // Test has_not_op_v.
}

다음과 같이 출력됩니다.

#include "../../../include/concepts/operations/has_or_op_v.hpp"

int main() {
  / Test has_not_op_v.
}

나는 단지 sed가 하나를 제거 ../하고 삭제하기 를 원 type_properties/하지만 이로 인해 내 의견도 깨집니다.

답변1

역할 .메타 문자. 즉 특별한 의미가 있다는 뜻이다. ."단일 문자 또는 문자와 일치"를 의미합니다. 리터럴 .문자 만 일치시키려고 합니다 .

.으로 변경하면 \.올바른 출력을 얻을 수 있습니다.

예:

sed -i -e "s/..\///" -e "s/type_properties\///" testfile

이 되다:

sed -i -e "s/\.\.\///" -e "s/type_properties\///" testfile

답변2

첫째, sed -i테스트할 때 사용하지 마세요. 먼저 실행 -i하고 결과를 확인하지 않고. 당신이 그것이 옳아 보인다는 것을 알면그 다음에-i파일에 대한 커밋 변경 사항이 추가되었습니다 .

그 이유는 sed요청한 것 이상인 것 같습니다. 왜냐하면 main()함수의 주석이 두 표현식 ..\/(두 문자와 슬래시) 중 첫 번째 표현식과 일치하기 때문입니다.

로 시작하는 줄에만 변경 사항을 적용하려는 경우 #include다음을 사용할 수 있습니다.

sed -e '/^#include/{s%\.\./%%; s%type_properties/%%;}' file.c

여기서는 문자열로 시작하는 줄에서만 두 번의 교체가 수행됩니다 #include. 또한 첫 번째 표현에서 두 개의 점을 올바르게 이스케이프 처리하여 "모든 문자"가 아닌 점과 일치하도록 했습니다. 일치하는 텍스트에 슬래시가 포함되어 있으므로 명령에서 대체 구분 기호를 사용 하기로 선택했습니다 %.s

관련 정보