无法弄清楚如何在使用 awk 时转义所有内容。
我需要用单引号将每个输入字符串括起来,例如
input
string1
string2
string3
output
'string1'
'string2'
'string3'
我一直在与逃跑' " $0
和其他一切作斗争,但我就是无法让它发挥作用。要么 $0 直接传递给 bash,要么发生其他情况。
答案1
这里有几种方法:
使用八进制转义序列。在基于 ASCII 的系统上,
'
编码为字节 39(八进制 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 代码包含在 shell 脚本中,并且 awk 代码位于单引号文字中,则必须安排将单引号字符传递给 awk。使用单引号-反斜杠-单引号-单引号'\''
在单引号 shell 文字中包含单引号字符。
awk '{ print "'\''" $0 "'\''" }'
或者,不使用单引号字符来表达 awk 代码。您可以使用反斜杠后跟三个八进制数字来表示 awk 中字符串文字中的任何字符。对于基于 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'