Bash 쉘에서 다음 명령을 실행하려고 합니다.
sed -i "s/\(update.*\)where /\1 where primary_id = '$primary_id', /" *.php
보시다시피 저는 sed를 사용하여 변수를 삽입하고 있습니다 '$primary_id'
. 명령을 실행한 후 '
표시되었지만 $primary_id
누락된 것을 확인했습니다 .
예를 들어 특수 문자를 처리하는 방법은 무엇입니까 '
?
답변1
이것을 좀 더 간단하게 만들어 보겠습니다. a
( '$b'
dollar,ab)의 각 항목을 작은따옴표로 바꾸려고 합니다 . c
, $b
변수에 발생하는 확장은 원하는 것이 아닙니다.
b=c
sed -i "s/a/'$b'/g" *.php
위 명령은 질문에서 수행한 명령과 유사합니다. 문자열이 s/a/'$b'/g
큰따옴표로 묶여 있으므로 변수가 확장되어 문자열이 'c'
.
전체 sed
명령을 큰따옴표로 묶은 경우 이스케이프해야 합니다 $
. 해결책은 다음과 같습니다.
sed -i "s/a/'\$b'/g" *.php\
또 다른 가능성은 쉘에 특별한 의미가 있는 문자를 제외하고는 아무 것도 인용하지 않는 것입니다(권장되지는 않지만 잠재적으로 통찰력이 있음).
sed -i s/a/\'\$b\'/g *.php
답변2
내가 오해하지 않는 한, 명령은 예상대로 정확하게 작동합니다.
$ cat test_file
update name where a='b'
$ export primary_id="test"
$ sed -i "s/\(update.*\)where /\1 where primary_id = '$primary_id', /" test_file
$ cat test_file
update name where primary_id = 'test', a='b'
답변3
s 앞에 오는 특수 문자는 \
문자 그대로 처리됩니다.
(괄호: ( \( \)
)와 마찬가지로).
다음과 같아야 합니다: \'
.
그래도 작동하지 않으면 다음을 시도해 보세요 '\''
.
또는 16진수 이스케이프 시퀀스를 사용해 보십시오: \x27
.
또한 다음과 같이 sed
: 표현을 둘러싸세요.
하나의 인용 부호( 's/1/2/g'
). 아니요 더블스 ( ."s/1/2/g"
)
sed -i 's/\(update.\*\)where /\1 where primary_id = \'$primary_id\', /' \*.php
sed -i 's/\(update.\*\)where /\1 where primary_id = '\''$primary_id'\'', /' \*.php
sed -i 's/\(update.\*\)where /\1 where primary_id = \x27$primary_id\x27, /' \*.php