awkを使用すると、すべてを脱出する方法がわかりません。
各入力文字列を次の単一引用符で囲む必要があります。
input
string1
string2
string3
output
'string1'
'string2'
'string3'
私は' " $0
逃げることに関連するすべてに対抗して戦っていましたが、とても成功することはできませんでした。 $ 0がbashに直接渡されるか、別のことが起こります。
答え1
これを行う方法はいくつかあります。
8進エスケープシーケンスを使用してください。 ASCIIベースのシステムでは、
'
エンコードはバイト39(8進数047)です。awk '{print "\047" $0 "\047"}' input 'string1' 'string2' 'string3'
参照を変数として渡す
$ 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'