programing

어떻게 하면 이중 따옴표 안에서 이중 따옴표를 피할 수 있습니까?

instargram 2023. 5. 12. 20:12
반응형

어떻게 하면 이중 따옴표 안에서 이중 따옴표를 피할 수 있습니까?

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 '\"'이중 따옴표를 사용하여 올바르게 탈출할 수 있습니다.변수를 사용하려고 하므로 변수에 단일 따옴표를 사용할 수 없습니다.$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

이미 오픈한 것을 마무리하는 것으로 완성됩니다 ('), 다른 인용문에 인용문을 삽입합니다("'"), 그리고 나서 다른 것을 엽니다(').

기타 예: 단일 따옴표 문자열 내의 단일 따옴표 이스케이프

에코해야 하는 문자의 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"

# Output:
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

큰따옴표 문자를 변수에 저장합니다.

dqt='"'
echo "Double quotes ${dqt}X${dqt} inside a double quoted string"

출력:

Double quotes "X" inside a double quoted string

printf를 확인합니다...

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

printf를 사용하지 않음

echo -e $mystr

출력: "안녕"이라고 말합니다.

printf 사용

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

출력: \"안녕\"이라고 말합니다.

$"string"을 사용합니다.

이 예에서는 다음과 같습니다.

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

참고(man 페이지에서):

달러 기호($"string") 앞에 큰따옴표로 묶인 문자열을 사용하면 현재 로케일에 따라 문자열이 변환됩니다.현재 로케일이 C 또는 POSIX인 경우 달러 기호는 무시됩니다.문자열이 변환되고 교체되는 경우 교체는 이중 따옴표로 묶입니다.

Bash 스크립트에 공백이 포함될 수 있는 변수와 함께 사용하려면 주 따옴표 안에 다음과 같은 세 개의 따옴표를 사용합니다.

[ "$(date -r """$touchfile""" +%Y%m%d)" -eq "$(date +%Y%m%d)" ]

더하다"\"를 붙이기 에, 을피위이인전용에중대신해것, ▁of▁before▁double,.\

#! /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-can-i-escape-a-double-quote-inside-double-quotes

반응형