문자열을 sed하고 폴더 경로로 바꾸는 방법


14

다음 bash 스크립트를 작성하려고합니다.

HOME_DIR=/opt/my_home
find ./CONFIG -type f -exec sed -i "s/_HOME_DIR_/$_HOME_DIR/g" {} \;

파일에서 변경하려는 줄은 다음과 같습니다.

users                   = "_HOME_DIR_/config/data/_DOMAIN_/users.conf"

따라서 최종 결과는 다음과 같아야합니다.

users                   = "/opt/my_home/config/data/_DOMAIN_/users.conf"

그러나 나는 그것을 얻지 못했습니다 ... 나는 탈출 문자 때문이라고 생각합니다 ...

누구나 빛을 비출 수 있습니까?

감사


당신은 약간의 빛
Alexandre Holden Daly

답변:


23

대체 문자열 또는 패턴 문자열에 슬래시가 포함 된 경우 GNU sed가 대체 명령에 대한 대체 구분 기호를 허용한다는 사실을 활용할 수 있습니다. 구분 기호의 일반적인 선택은 파이프 문자 |또는 해시 #입니다. 구분 문자의 최선의 선택은 종종 처리되는 파일의 유형에 따라 다릅니다. 당신의 경우에 당신은 시도 할 수 있습니다

sed -i "s#_HOME_DIR_#$HOME_DIR#"

또한 변수 이름 $ HOME_DIR을 잘못 입력했습니다 (밑줄로 시작하지 않음).

$ HOME_DIR=/opt/my_home
$ echo "_HOME_DIR_/config/data/_DOMAIN_/users.conf" | sed "s#_HOME_DIR_#$HOME_DIR#"
/opt/my_home/config/data/_DOMAIN_/users.conf

스크립트에서 사용자 변수에 대해 모두 대문자를 사용하지 않으려는 경우 시스템 변수를 위해 예약해야합니다. 또한 g한 줄에 여러 번 교체하지 않으면 스위치가 필요하지 않습니다.


0

변수 'opt / home'을 하드 코딩하면 다음과 같이 작동합니다.

find ./CONFIG -type f -exec sed -i "s/\_HOME\_DIR\_/opt\/home/g" {} \;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.