shell script 작성시 sed로 뭔가 치환하려고 하는데 경로명 같이 / 가 들어가서 에러가 발생하는 경우가 있음.

#!/bin/sh
 
STR='CURRENT_DIR = CWD'                                                                            
REPLACE=$(pwd)                                                                                     
 
echo $STR | sed -e "s/CWD/$REPLACE/g"
 
 
# CURRENT_DIR = 현재경로를 표시하고 싶으나 에러 발생
# sed: -e expression #1, char 9: unknown option to `s'

 

문제가 / 일 경우 delimiter를 / 대신 다른 걸 사용하는 방법이 제일 간편함.

#!/bin/sh
 
STR='CURRENT_DIR = CWD'                                                                            
REPLACE=$(pwd)                                                                                     
 
# delimiter를 / 대신 # 사용
# # 외에도 ! | @ _ 공백 , . ; : ? ~ 등 다양한 문자를 delimiter로 사용할 수 있음
# _ 의 경우 이번 예처럼 변수일 경우 변수로 인식되는 문제가 있으므로 그게 아닐 경우에만 사용할 것
echo $STR | sed -e "s#CWD#$REPLACE#g"

 

굳이 escape를 하고 싶다면 아래처럼 치환패턴 문자열에서 걸릴 것 같은 문자들을 escape 처리해주면 됨.

 

#!/bin/sh
 
STR='CURRENT_DIR = CWD'                                                                            
REPLACE=$(pwd)                                                                                     
ESCAPED_REPLACE=$(printf '%s\n' "$REPLACE" | sed -e 's/[\/.*?&)(}{[&]/\\&/g')                               
 
echo $STR | sed -e "s/CWD/$ESCAPED_REPLACE/g"

 

 

.

Posted by bloodguy
,