awk를 사용하는 동안 모든 것을 이스케이프하는 방법을 알아낼 수 없습니다.
각 입력을 묶어야합니다. 작은 따옴표가있는 문자열, 예 :
input string1 string2 string3 output "string1" "string2" "string3"
" " $0
및 기타 모든 항목을 이스케이프 처리하고 있지만 만들 수 없습니다. 작동합니다. $ 0이 bash에 직접 전달되거나 다른 일이 발생합니다.
댓글
- 슈퍼 유저에 대한 유사한 질문 .
답변
다음은 몇 가지 방법입니다.
-
8 진수 이스케이프 시퀀스를 사용합니다.
"
가 바이트 39 (8 진수 047)로 인코딩되는 ASCII 기반 시스템에서는 다음과 같습니다.awk "{print "\047" $0 "\047"}" input "string1" "string2" "string3"
-
따옴표를 변수로 전달
$ 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