awk 打印撇号/单引号

awk 打印撇号/单引号

无法弄清楚如何在使用 awk 时转义所有内容。

我需要用单引号将每个输入字符串括起来,例如

input
string1
string2
string3

output
'string1'
'string2'
'string3'

我一直在与逃跑' " $0和其他一切作斗争,但我就是无法让它发挥作用。要么 $0 直接传递给 bash,要么发生其他情况。

答案1

这里有几种方法:

  1. 使用八进制转义序列。在基于 ASCII 的系统上,'编码为字节 39(八进制 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 代码包含在 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'

相关内容