awk 인쇄 아포스트로피/작은따옴표

awk 인쇄 아포스트로피/작은따옴표

awk를 사용할 때 모든 것을 탈출하는 방법을 알 수 없습니다.

각 입력 문자열을 다음과 같은 작은따옴표로 묶어야 합니다.

input
string1
string2
string3

output
'string1'
'string2'
'string3'

나는 ' " $0도망치는 것과 관련된 모든 것에 맞서 싸우고 있었지만, 도저히 성공할 수 없었습니다. $0이 bash에 직접 전달되거나 다른 일이 발생합니다.

답변1

이를 수행하는 방법에는 여러 가지가 있습니다.

  1. 8진수 이스케이프 시퀀스를 사용하세요. ASCII 기반 시스템에서 '인코딩은 바이트 39(8진수 047)입니다.

    awk '{print "\047" $0 "\047"}' input
    'string1'
    'string2'
    'string3'
    
  2. 참조를 변수로 전달

     $ awk -v q="'" '{print q $0 q}' input
     'string1'
     'string2'
     'string3'
    

답변2

awk 코드에서는 큰따옴표 안에 아포스트로피를 넣습니다. 문자열 구성 방법(리터럴, 변수, 필드 참조, 대괄호 표현식...)에 관계없이 문자열을 서로 옆에 배치하여 연결할 수 있습니다(연결).

{ print "'" $0 "'" }

이 awk 코드가 쉘 스크립트에 포함되어 있고 awk 코드가 작은따옴표 리터럴로 되어 있는 경우 작은따옴표 문자가 awk에 전달되도록 준비해야 합니다.작은따옴표-백슬래시-작은따옴표-작은따옴표를 사용하세요.'\''작은따옴표로 묶인 쉘 리터럴 내에 작은따옴표 문자가 포함되어 있습니다.

awk '{ print "'\''" $0 "'\''" }'

또는 작은따옴표 문자를 사용하지 않고 awk 코드를 표현하세요. awk의 문자열 리터럴에 있는 모든 문자를 나타내기 위해 백슬래시 뒤에 8진수 세 자리를 사용할 수 있습니다. ASCII 기반 시스템의 작은따옴표의 경우, 즉 \047.

awk '{ print "\047" $0 "\047" }'

답변3

이 작업을 수행할 필요는 없습니다 awk.

paste대신 기본 유틸리티를 사용할 수 있습니다 .

 < input paste -d "'" /dev/null - /dev/null

awk이는 기반 또는 기반 솔루션보다 더 효율적이고 덜 제한적입니다 sed.

답변4

백슬래시나 다른 트릭을 사용하지 않고 다음을 수행합니다.

$ printf "hello\nworld\n" | awk '{print "'"'"'" $1 "'"'"'"}'
'hello'
'world'

관련 정보