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

awk를 사용하는 동안 모든 것을 이스케이프하는 방법을 알아낼 수 없습니다.

각 입력을 묶어야합니다. 작은 따옴표가있는 문자열, 예 :

input string1 string2 string3 output "string1" "string2" "string3" 

" " $0 및 기타 모든 항목을 이스케이프 처리하고 있지만 만들 수 없습니다. 작동합니다. $ 0이 bash에 직접 전달되거나 다른 일이 발생합니다.

댓글

답변

다음은 몇 가지 방법입니다.

  1. 8 진수 이스케이프 시퀀스를 사용합니다. "가 바이트 39 (8 진수 047)로 인코딩되는 ASCII 기반 시스템에서는 다음과 같습니다.

    awk "{print "\047" $0 "\047"}" input "string1" "string2" "string3" 
  2. 따옴표를 변수로 전달

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

댓글

  • "\047"은 (는) 내 마음을 떠난 적이 없습니다.와, 감사합니다.
  • O r awk 스크립트를 script.awk 파일에 저장하여 awk -f script.awk input로 실행 한 다음 { print "'" $0 "'" } 또는 { printf "'%s'\n", $0 }. '로 구분 된 스크립트에서 '를 사용할 수 없다는 것은 awk 문제가 아니라 셸 문제입니다.
  • man ascii에서 탈출 한 8 진수는 awk에서 좋습니다. NUL의 경우 \000 (GNU / awk이지만 mawk는 아님) 및 "의 경우 \042 .
  • # 3을 추가하는 것이 좋습니다 : 셸 수준에서 따옴표를 이스케이프 처리 : awk '{ print "'\''" $0 "'\''" }' input 및 # 4는 셸 수준에서 큰 따옴표를 사용합니다. awk "{print \"'\" \$0 \"'\" }" input. 이것은 허용되는 답변이고 이미 여러 메소드를 나열하고 있으므로 이러한 대안도 포함 할 수 있습니다.

답변

awk 코드에서는 큰 따옴표 안에 아포스트로피를 넣으면됩니다. 이러한 문자열이 어떻게 구성되었는지 (리터럴, 변수, 필드 참조, 괄호로 묶인 표현식,…)에 관계없이 문자열을 나란히 배치 (병치)하여 문자열을 연결할 수 있습니다.

 { print """ $0 """ }  

이 awk 코드가 셸 스크립트에 포함되어 있고 awk 코드가 작은 따옴표로 묶인 리터럴에있는 경우 전달하도록 정렬해야합니다. awk에 대한 작은 따옴표 문자. 작은 따옴표-백 슬래시 -single-quote-single-quote "\"" 를 사용하여 작은 따옴표로 묶인 쉘 리터럴.

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

또는 사용하지 않고 awk 코드를 표현합니다. 작은 따옴표 문자. 백 슬래시와 3 개의 8 진수를 사용하여 awk에서 문자열 리터럴의 모든 문자를 나타낼 수 있습니다. ASCII 기반 시스템의 작은 따옴표의 경우 “\047입니다.

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

댓글

  • awk '{ print "'\''" $0 "'\''" }' 이것은 미친 짓입니다.
  • @ ArtemS.Tashkinov It ' 또한 이식성 측면에서 훨씬 뛰어난 솔루션이며, 쉘을 알고있는 사람에게 더 이해하기 쉽다고 주장합니다. 그들은 ' 8 진수 이스케이프보다 셸을 사용하고 있습니다. '\''는 셸 스크립팅을 수행하는 모든 사람이 작은 따옴표를 이스케이프하는 방법으로 내부화해야합니다. 작은 따옴표로 묶인 셸 문자열, 특히 작은 따옴표로 묶은 문자열은 모든 Bourne 유사 셸에서 임의의 문자열을 이스케이프 할 수있는 강력하고 / 이동 가능하며 가장 안전한 방법이기 때문입니다. 그러나 awk 코드를 큰 따옴표로 묶은 문자열에 넣을 수도 있습니다. awk "{print \"'\" \$0 \"'\" }"

답변

참고 이를 위해 awk가 필요하지 않습니다.

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

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

awk 기반 또는 sed 기반 솔루션.

답변

awk 코드는

{ print """ $0 """ } 

파일에 넣을 수 있으므로 인용 할 필요가 없습니다.

$ printf "a\nb\n" | awk -f quote.awk "a" "b" 

또는 큰 따옴표로 묶인 문자열을 입력하고 따옴표와 달러 기호를 이스케이프합니다.

$ printf "a\nb\n" | awk "{ print \""\" \$0 \""\" }" 

또는 Bash / ksh / zsh에서 $"..." 따옴표 형식 : 작은 따옴표를 이스케이프 처리 할 수 있습니다.

$ printf "a\nb\n" | awk $"{ print "\"" $0 "\"" }" 

Answer

sed 명령도 사용할 수 있습니다.

<infile sed -E "s/^|$/"/g" 

또는

<infile sed -E "s/.*/"&"/" 

댓글

  • 또는 sed -E "s/.*/'&'/" infile.
  • @chepner 예, 답변으로 옮겼습니다.)

답변

One 문자열을 작은 따옴표로 묶는 방법은 printf 명령 gnu xargs를 사용하는 것입니다.

< file xargs -d"\n" printf ""%s"\n" 

Perl

perl -sple "$_="$q$_$q"" -- -q=\" file 

GNU sed 사용 :

sed -e "G;H;z;x;y/\n/"/" file 

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다