awkの使用中にすべてをエスケープする方法がわかりません。
各入力を囲む必要があります一重引用符で囲まれた文字列。例:
input string1 string2 string3 output "string1" "string2" "string3"
" " $0
をエスケープして戦い、他のすべてのものを作成できません。 $ 0が直接bashに渡されるか、何か他のことが起こります。
コメント
- スーパーユーザーに関する同様の質問。
回答
いくつかの方法があります:
-
引用符エスケープシーケンスを使用します。
"
がバイト39(octal 047)としてエンコードされているASCIIベースのシステムでは、次のようになります。awk "{print "\047" $0 "\047"}" input "string1" "string2" "string3"
-
引用符を変数として渡す
$ awk -v q=""" "{print q $0 q}" input "string1" "string2" "string3"
コメント
-
"\047"
は私の頭に浮かんだことはありません。うわー。ありがとう。 - O rawkスクリプトをファイル
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-backslash-single-quote-single-quote "\""
を使用して、一重引用符で囲まれたシェルリテラル。
awk "{ print ""\""" $0 ""\""" }"
または、を使用せずにawkコードを表現します。一重引用符。バックスラッシュの後に3進数の数字を使用して、awkの文字列リテラル内の任意の文字を表すことができます。 ASCIIベースのシステムでの一重引用符の場合、それは\047
です。
awk "{ print "\047" $0 "\047" }"
コメント
-
awk '{ print "'\''" $0 "'\''" }'
これはクレイジーです。 - @ ArtemS.Tashkinov It 'は、移植性に関してもはるかに優れたソリューションであり、シェルを知っている人にとっては理解しやすいと思います。 'オクタルエスケープよりもシェルを使用しています。
'\''
は、シェルスクリプトを実行する人は誰でも、一重引用符で囲まれたシェル文字列、特に一重引用符で囲まれた文字列は、ボーンのようなすべてのシェルで任意の文字列をエスケープするための堅牢/ポータブル/最も安全な方法であるためです。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 "\"" }"
回答
sed
コマンドも使用できます。
<infile sed -E "s/^|$/"/g"
または
<infile sed -E "s/.*/"&"/"
コメント
- または
sed -E "s/.*/'&'/" infile
。 - @chepnerはい、それを回答に移しました:)
回答
1つ 文字列を一重引用符で囲む方法は、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