awk 내에서 작은 따옴표를 이스케이프하는 방법


111

나는 다음을 원한다

awk 'BEGIN {FS=" ";} {printf "'%s' ", $1}'

그러나 이런 식으로 작은 따옴표를 이스케이프하면 작동하지 않습니다.

awk 'BEGIN {FS=" ";} {printf "\'%s\' ", $1}'

어떻게하나요? 도와 줘서 고마워.


많은 언어가 따옴표 중 두 개를 연속으로 배치하여 따옴표를 이스케이프 처리 할 수 ​​있습니다.
joshuahealy

awk 'BEGIN {FS = "";} {printf "' '% s' '", $ 1}'시도했지만 작은 따옴표가 인쇄되지 않았습니다.

이 페이지 는 작은 따옴표 문자열에 작은 따옴표를 포함하는 것이 불가능하다고 말합니다. 큰 따옴표로 변환해야 할 수도 있습니다.
joshuahealy

2
불가능하지만 인접한 두 개의 작은 따옴표 쉘 문자열이 하나의 매개 변수로 함께 붙습니다. 그리고 공백이 아닌 문자로 붙인 두 개의 작은 따옴표 쉘 문자열도 하나의 큰 glob에 붙습니다. 'abc'd'ef'is abcdef: literal plus dplus literal. 는 d따옴표의 외부, 당신은 것을 대체 할 수 d그것으로 \'만들기 위해 'abc'\''ef'에있는 평가합니다 abc'ef.
카즈

답변:


160

이것은 아마도 당신이 찾고있는 것입니다.

awk 'BEGIN {FS=" ";} {printf "'\''%s'\'' ", $1}'

즉, '\''오프닝을 닫은 '다음 '이스케이프 하여 리터럴을 인쇄 하고 마지막으로 '다시 엽니 다 .


48
awk와는 관련이 없습니다. '문자는 오프닝 닫 '쉘 문자열 리터럴을. 쉘 리터럴은이를 위해 백 슬래시 이스케이프를 지원하지 않습니다. 시퀀스는 '\''그 (탈출하여 따옴표 리터럴 지정 따옴표 폐쇄 : 트릭을 수행 되어 다음 따옴표 리터럴 외부 지원) 새로운 따옴표 리터럴 재 - 연다. 작은 따옴표를 얻기 위해 4 자 이스케이프 시퀀스로 생각할 수 있습니다. :)
카즈

2
@Steve : 매우 유용한 답변을 주셔서 감사합니다. 당신은 저에게 많은 두통을 구했습니다!
John Slegers 2014-06-11

4
@syntaxerror 호출을위한 인수를 준비하는 데 사용하는 따옴표 awk는 순전히 명령 줄을 작성하는 데 사용하는 명령 인터프리터의 문제입니다. 는 '{printf $2}'에 대한 몇 가지 인수에 점등되고 execve그냥 단일 따옴표없이 널 종료 C 문자열과 같은 시스템 호출 또는 유사한. Awk는 따옴표를 보지 않고 sed도 보지 않습니다. 실제로 큰 따옴표를 사용할 수 있지만 큰 따옴표는 셸의 확장을 방지하지 않으므로 $2백 슬래시로 달러 기호를 이스케이프해야 문자 그대로 : "{printf \$2}".
Kaz

4
@syntaxerror 사용자 정의에 따라 인라인 awk 스크립트는 일반적으로 작은 따옴표로 이스케이프됩니다. sed 정규식 (또는 기타)에 쉘 구문이 포함되어있는 경우에도주의해야합니다. sed -e "s/$FOO/$BAR/"의도는 리터럴 텍스트 대체 할 경우 작동하지 않습니다 $FOO와를 $BAR. 가장 쉬운 방법은 sed -e 's/$FOO/$BAR/.
Kaz

1
@syntaxerror awk 프로그램을 큰 따옴표로 묶으면 awk "{ print \"abc\", \$1 }". awk 프로그램에 큰 따옴표가 나타날 때마다 셸 따옴표를 닫지 않도록 이스케이프 처리해야합니다. 그리고 이것을 비교하십시오 : awk '{print "\\"}'(백 슬래시를 인쇄하십시오)와 큰 따옴표로 취한 것 : awk "BEGIN {print \"\\\\\" }", Phew! 두 따옴표를 모두 이스케이프해야하며 두 백 슬래시를 모두 사용해야합니다. 쉘 변환 \\ \ 우리가 필요로하므로 \\\\ 인코딩에 \\ .
Kaz

76

작은 따옴표는 \x27

처럼

awk 'BEGIN {FS=" ";} {printf "\x27%s\x27 ", $1}'

출처


16
+1, 추가해야 함 : \x27확장 프로그램입니다. POSIX Awk는 \047. ( \478 진수가 나오지 않아도 괜찮습니다.)
hemflit 2013 년

1
\ x27 뒤에 다른 번호가 있으면 어떻게 끝낼까요?
Jason Axelson 2013-08-24

1
Jason, "AAA \ x27" "1"이라는 두 개의 문자열 리터럴을 연결합니다. 또는 8 진수를 사용합니다.
hemflit

9
항상 \04716 진수 ( )가 아닌 8 진수 ( \x27), 이스케이프 코드를 사용하십시오 . awk.freeshell.org/PrintASingleQuote를 참조하십시오 .
Ed Morton

35

또 다른 옵션은 작은 따옴표 를 awk 변수로 전달하는 것입니다 .

awk -v q=\' 'BEGIN {FS=" ";} {printf "%s%s%s ", q, $1, q}'

문자열 연결을 사용한 더 간단한 예 :

# Prints 'test me', *including* the single quotes.
$ awk -v q=\' '{print q $0 q }' <<<'test me'
'test me'

5
특히 많은 따옴표를 사용해야하는 경우 명확하고 간결합니다.
Peter Gluck 2014 년

18
awk 'BEGIN {FS=" "} {printf "\047%s\047 ", $1}'

1
그것이 \047작은 따옴표 문자에 대한 8 진 이스케이프 시퀀스 라는 것을 기억하는 한 ,이 대안이 가장 읽기 쉽습니다.
Anthony Geoghegan

4

작은 스크립트의 경우 읽기 쉽게 만드는 선택적 방법은 다음과 같은 변수를 사용하는 것입니다.

awk -v fmt="'%s'\n" '{printf fmt, $1}'

출력에서 작은 따옴표 문자를 여러 번 생성해야하고 \ 047이 완전히 읽을 수 없게 만드는 경우에 편리함을 발견했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.