문자열/파일의 모든 따옴표를 이스케이프 처리하는 도구

문자열/파일의 모든 따옴표를 이스케이프 처리하는 도구

좋은 해결책이 없는 이상한 문제가 있습니다.

어떤 이유에서인지 우리 회사에서는 스크립트 코드를 데이터베이스 테이블에 저장합니다. 묻지 마세요. 새 버전의 코드를 삽입해야 할 때마다 파일을 반복하고 명령문에서 실행하기 위해 모든 문자열을 수동으로 백슬래시해야 합니다 insert.

수동 작업을 수행하지 않고도 복사하여 붙여넣을 수 있도록 파일의 모든 문자열을 이스케이프 처리할 수 있는 도구가 있습니까?

파일에는 작은따옴표와 큰따옴표뿐만 아니라 따옴표 안의 따옴표도 포함될 수 있습니다 "this is \"weird\"".

다음은 제가 실행 중인 쿼리의 예입니다.

delimiter $$
insert into table (code) values ("package a.b.c; 
class SomeClass {
    var thing = "so \"weird\" and thing's stuff"

}");

공백이나 세미콜론을 이스케이프 처리할 필요는 없지만 따옴표를 깨는 내용은 이스케이프해야 합니다. 변수의 내용은 thing위에 제시한 예의 참조를 깨뜨립니다.

답변1

모든 큰따옴표와 백슬래시를 이스케이프하려면 다음을 사용할 수 있습니다.

perl -wpe 's/([\\"])/\\$1/g'

xclip과 함께 사용할 수도 있습니다:

cat myfile | perl -wpe 's/([\\"])/\\$1/g' | xclip -selection clipboard

답변2

POSIXly에서는 셸에 다시 입력하기 위해 모든 문자열을 연결된 문자열로 안전하게 이스케이프할 수 있습니다. 예를 들면 다음과 같습니다.

alias "string=$(cat file)"; alias string

alias출력을 하드 참조하고 앞에 추가합니다.(적어도) string=문자열의 머리 부분에.bash (표준 위반)alias또한 출력 헤드에 문자열을 추가합니다 . 그래도 eval모든 문자열에 대해 친숙한 인용 버전을 얻을 수 있습니다 . 예를 들면 다음과 같습니다.

string=$(alias "string=$(cat file)"; alias string)
string=${string#*=}

또는 클립보드에 넣으세요.

<infile sh -c 'alias "c=$(cat)" c' | sed 1s/..// | xsel -bi 

답변3

큰 타격:

> printf %q "this is \"weird\""
this\ is\ \"weird\"

> printf -v var %q "this is \"weird\""
> echo $var
this\ is\ \"weird\"

답변4

Oracle, mysql, sqlite에는 모두 quote기능이 있습니다. var thing = quote("so \"weird\" and thing's stuff")작동할 수도 있습니다.

코드가 한 가지 방식으로 변환된 것 같습니다. 백슬래시를 사용하여 작은따옴표와 큰따옴표를 이스케이프하면 어떤 것을 제거해야 할지 모르기 때문에 되돌리기가 어렵습니다.
양방향으로 일반 및 바이너리 변환을 안전하게 수행하는 더 좋은 방법은 base64 인코딩입니다.

echo \'\"\' \"\'\" \\
'"' "'" \
echo \'\"\' \"\'\" \\ | base64
JyInICInIiBcCg==
echo JyInICInIiBcCg== | base64 -d
'"' "'" \  

공간을 절약하기 위해 압축할 수 있습니다.

wc -c  /usr/bin/bashbug
6957
gzip < /usr/bin/bashbug | base64 |wc -c
4094

관련 정보