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進数3桁を使用できます。 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'

関連情報