좋은 해결책이 없는 이상한 문제가 있습니다.
어떤 이유에서인지 우리 회사에서는 스크립트 코드를 데이터베이스 테이블에 저장합니다. 묻지 마세요. 새 버전의 코드를 삽입해야 할 때마다 파일을 반복하고 명령문에서 실행하기 위해 모든 문자열을 수동으로 백슬래시해야 합니다 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