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