sed #, %, / 및 |의 차이점

sed #, %, / 및 |의 차이점

데이터베이스의 문자열을 바꾸려고 합니다. 아래에서 가능한 해결책을 찾았습니다. #or 을 사용하면 %나에게 적합하지만 /and 에서는 작동하지 않습니다 |. 처음 두 가지가 작동하는 이유와 차이점이 무엇인지 설명할 수 있는 사람이 있나요?

find . -type f -name 'file.sql' -exec sed -i '' s#http://a.com#http://b.com#g {} +
find . -type f -name 'file.sql' -exec sed -i '' s%http://a.com%http://b.com%g {} +
find . -type f -name 'file.sql' -exec sed -i '' s/http://a.com/http://b.com/g {} +
find . -type f -name 'file.sql' -exec sed -i '' s|http://a.com|http://b.com|g {} +

답변1

sed 교체 명령대개명령, 검색 문자열, 대체 문자열 및 플래그 /간의 구분 기호 로 사용됩니다. s그러나 검색 문자열이나 대체 문자열에 가 포함될 수 있는 경우 /구분 기호를 다음 문자로 변경합니다.아니요어떤 문자열에서든.

sed에게 빈 문자열을 백업 확장으로 사용하라고 지시했을 때 sed에서 또 다른 오류가 발생했습니다. 확장을 사용하지 않았으므로 빈 따옴표를 넣지 마십시오. (참고: 이는 GNU sed에서만 작동합니다. 예를 들어 Mac에서 BSD sed를 사용하는 경우하다백업 확장자를 지정하지 않으려면 빈 문자열이 필요합니다. )

Sed는 구분 기호가 무엇인지 신경 쓰지 않지만 주변의 쉘은 아마도 신경 쓸 것입니다.

|기호는 파이프를 나타냅니다. 이를 구분 기호로 사용하려면 셸에서 보호할 수 있도록 어떤 방식으로든 인용해야 합니다.

#기호는 쉘에 따라 주석 문자열을 도입할 수 있으므로( #bash는 주석이 단어의 첫 번째 문자인 경우에만 주석을 시작합니다) 안전하게 인용하는 것이 가장 좋습니다.

데이터에 /문자가 포함되어 있으므로 다른 구분 기호를 사용하거나 /검색 및 바꾸기 문자열에서 각 인스턴스를 이스케이프해야 합니다. 이는 소위기울어진 이쑤시개 증후군모양 때문에 읽기가 어렵습니다 \/.

따라서 다음과 같은 것이 필요합니다.

find . -type f -name 'file.sql' -exec sed -i -e 's#http://a.com#http://b.com#g' {} +

또는

find . -type f -name 'file.sql' -exec sed -i -e 's|http://a.com|http://b.com|g' {} +

또는

find . -type f -name 'file.sql' -exec sed -i -e "s|http://a.com|http://b.com|g" {} +

또는

find . -type f -name 'file.sql' -exec sed -i -e 's/http:\/\/a.com/http:\/\/b.com/g' {} +

관련 정보