' 특수 문자가 포함된 Sed 명령

' 특수 문자가 포함된 Sed 명령

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

관련 정보