tech\
나는 이와 같은 줄이 많이 포함된 file.php의 모든 문자열을 제거하려고 합니다 "tech\/what-is-vnet"
. 이 명령은 왜 아무 작업도 수행하지 않습니까?
sed -i "s~tech\~~g" file.php
답변1
sed
백슬래시를 이스케이프 문자로 처리하십시오. 따라서 \~
명령 문자열에 표시되면 이스케이프된 의미를 갖는 것으로 해석되며 ~
구분 기호가 아닌 일치하는 문자열의 일부로 처리되어야 합니다. 이를 방지하려면 다음을 사용하여 백슬래시 자체를 이스케이프 처리해야 합니다.다른백슬래시:
sed -i 's~tech\\~~g' file.php
또한 큰따옴표 사용에서 작은따옴표 사용으로 변경되었습니다. 그것은 쉘 때문입니다 (Bourne과 같은 쉘이라고 가정)반품백슬래시를 이스케이프 문자로 처리합니다(와는 별개로작은 따옴표로 묶인 경우) 따라서 \\
큰 따옴표로 묶인 문자열을 발견하면 이스케이프된 백슬래시로 구문 분석합니다.두 번째 백슬래시만 전달하세요.sed
. 큰따옴표를 사용하려면 앞에 백슬래시를 하나 더 추가해야 합니다.각에 전달하려는 백슬래시 수 sed
, 총 백슬래시 수:
sed -i "s~tech\\\\~~g" file.php
sed
...이것이 및 패턴 과 같은 셸 메타 문자가 포함될 수 있는 콘텐츠에 작은따옴표를 사용하는 것이 권장되는 이유 중 하나입니다 .grep
ps 강제 관련 xkcd:https://xkcd.com/1638/.
pps는 실제로 세 개의 백슬래시입니다.회의큰따옴표를 사용하는 것은 쉘이 이스케이프된 문자를 처리하는 방식에 이상한 점이 있기 때문에 작동합니다. 예를 들어 ~
쉘은 이스케이프할 가치가 없다고 생각합니다. 그러나 이것을 고려하면 이 혼란은 더욱 혼란스러워질 뿐입니다.