IT story

큰 따옴표 안에 큰 따옴표를 이스케이프 처리하는 방법?

hot-time 2020. 4. 6. 08:11
반응형

큰 따옴표 안에 큰 따옴표를 이스케이프 처리하는 방법?


아무도 bash의 이중 문자열 내부에서 큰 따옴표를 이스케이프 처리하는 방법을 보여 줄 수 있습니까?

예를 들어 쉘 스크립트에서

#!/bin/bash

dbload="load data local infile \"'gfpoint.csv'\" into table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY \"'\n'\" IGNORE 1 LINES"

\"큰 따옴표 이스케이프 가있는 ENCLOSED BY 를 올바르게 얻을 수 없습니다 . variable을 사용하고 싶기 때문에 변수에 작은 따옴표를 사용할 수 없습니다 $dbtable.


백 슬래시를 사용하십시오.

echo "\""     # Prints one " character.

쉘에서 따옴표를 이스케이프 처리하는 간단한 예 :

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

이미 열린 하나 ( ') 를 마무리하고 이스케이프 된 하나 ( \')를 배치 한 다음 다른 하나 ( ') 를 열면 됩니다.

또는

$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc

이미 열린 하나 ( ') 를 마무리 하고 다른 따옴표 ( "'")에 따옴표 를 넣은 다음 다른 따옴표 ( )를 열면 '됩니다.

더 많은 예 : 작은 따옴표로 묶은 문자열 내에서 작은 따옴표를 이스케이프 처리


오늘이 오래된 문제가 bash 태그 목록에 오늘 나타난 이유를 모르겠지만 미래의 연구원을 위해 에코가 필요한 문자의 ASCII 코드를 사용하여 탈출을 피할 수 있음을 명심하십시오. 예:

echo -e "this is \x22\x27\x22\x27\x22text\x22\x27\x22\x27\x22"                                                                                                          
this is "'"'"text"'"'" 

\x22큰 따옴표 및 작은 따옴표에 대한 ASCII 코드 (16 진수)입니다 \x27. 마찬가지로 모든 문자를 에코 할 수 있습니다.

위의 문자열을 백 슬래시로 에코하려고하면 지저분한 두 행의 백 슬래시 에코가 필요하다고 가정합니다. :)

변수 할당의 경우 다음과 같습니다.

$ a=$'this is \x22text\x22'                                                                                                                                               
$ echo "$a"                                                                                                                                                               
this is "text"

변수가 다른 프로그램에 의해 이미 설정된 경우에도 sed 또는 유사한 도구를 사용하여 큰 따옴표 나 작은 따옴표를 적용 할 수 있습니다. 예:

$ b="just another text here"
$ echo "$b"
just another text here
$ sed 's/text/"'\0'"/' <<<"$b" #\0 is a special sed operator
just another "0" here #this is not what i wanted to be
$ sed 's/text/\x22\x27\0\x27\x22/' <<<"$b"
just another "'text'" here #now we are talking. You would normally need a dozen of backslashes to achieve the same result in the normal way.

Bash를 사용하면 문자열을 인접하게 배치 할 수 있으며 결국 서로 붙어 있습니다.

그래서 이건:

$ echo "Hello"', world!'

생산

Hello, world!

트릭은 필요에 따라 작은 따옴표와 큰 따옴표를 번갈아 사용하는 것입니다. 불행히도, 그것은 매우 지저분 해집니다. 예를 들면 다음과 같습니다.

$ echo "I like to use" '"double quotes"' "sometimes"

생산

I like to use "double quotes" sometimes

귀하의 예에서, 나는 다음과 같이 할 것입니다 :

$ dbtable=example
$ dbload='load data local infile "'"'gfpoint.csv'"'" into '"table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '"'"'"' LINES "'TERMINATED BY "'"'\n'"'" IGNORE 1 LINES'
$ echo $dbload

다음과 같은 출력이 생성됩니다.

load data local infile "'gfpoint.csv'" into table example FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY "'\n'" IGNORE 1 LINES

여기서 무슨 일이 일어나고 있는지 알기가 어렵지만 유니 코드 따옴표를 사용하여 주석을 달 수 있습니다. 다음은 bash에서 작동하지 않으며 단지 설명을위한 것입니다.

dbload=' load data local infile "'“ 'gfpoint.csv'” ' " into'“ table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '” ' "'“ ' LINES” ' TERMINATED BY "'“ '\n'” ' " IGNORE 1 LINES'

위의 " ''"와 같은 따옴표는 bash로 해석됩니다. 따옴표 " '는 결과 변수로 끝납니다.

이전 예제와 동일한 처리를 수행하면 다음과 같습니다.

$ echoI like to use' "double quotes"' sometimes


printf를 확인하십시오 ...

#!/bin/bash
mystr="say \"hi\""

printf를 사용하지 않고

echo -e $mystr

출력 : "hi"라고 말하십시오

printf 사용

echo -e $(printf '%q' $mystr)

출력 : say ""hi \ "


큰 따옴표 문자를 변수로 저장하십시오.

dqt = ' "'
echo "큰 따옴표로 묶은 문자열 안에 큰 따옴표 $ {dqt} X $ {dqt}"

산출:

큰 따옴표로 묶인 문자열 안에 큰 따옴표 "X"

$ "string"을 사용하십시오.

이 예에서는

dbload = $ "$ \ table '테이블에 로컬 파일 infile \"'gfpoint.csv '\ "를로드합니다.'$ '에 의해 종료 된 필드', ''\ ''에 의해 닫혀있는 라인

참고 ( man 페이지에서 ) :

큰 따옴표로 묶은 문자열 앞에 달러 기호 ($ "string")가 있으면 문자열이 현재 로케일에 따라 변환됩니다. 현재 로캘이 C 또는 POSIX 인 경우 달러 기호는 무시됩니다. 문자열이 번역 및 교체되면 교체는 큰 따옴표로 묶습니다.


"\"이스케이프 대신 큰 따옴표 앞에 추가하십시오.\

#! /bin/csh -f

set dbtable = balabala

set dbload = "load data local infile "\""'gfpoint.csv'"\"" into table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '"\""' LINES TERMINATED BY "\""'\n'"\"" IGNORE 1 LINES"

echo $dbload
# load data local infile "'gfpoint.csv'" into table balabala FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY "''" IGNORE 1 LINES

참고 URL : https://stackoverflow.com/questions/3834839/how-to-escape-a-double-quote-inside-double-quotes

반응형