큰 따옴표 안에 큰 따옴표를 이스케이프 처리하는 방법?
아무도 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로 해석됩니다. 따옴표 " '
는 결과 변수로 끝납니다.
이전 예제와 동일한 처리를 수행하면 다음과 같습니다.
$ echo
“ I 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
'IT story' 카테고리의 다른 글
JSON 데이터를 Java 객체로 변환 (0) | 2020.04.06 |
---|---|
GNU Make와 함께 CMake 사용 : 정확한 명령을 어떻게 볼 수 있습니까? (0) | 2020.04.06 |
Lodash _.pluck는 어떻게 되었습니까? (0) | 2020.04.06 |
PHP에서 문자열을 정수로 변환하는 가장 빠른 방법 (0) | 2020.04.06 |
사용중인 NumPy 버전을 어떻게 확인합니까? (0) | 2020.04.05 |