awk print apostrophe / single quote (日本語)

awkの使用中にすべてをエスケープする方法がわかりません。

各入力を囲む必要があります一重引用符で囲まれた文字列。例:

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

" " $0をエスケープして戦い、他のすべてのものを作成できません。 $ 0が直接bashに渡されるか、何か他のことが起こります。

コメント

回答

いくつかの方法があります:

  1. 引用符エスケープシーケンスを使用します。"がバイト39(octal 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 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 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です