awk 打印撇号/单引号

Art*_*nov 8 awk shell-script quoting escape-characters

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

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

input
string1
string2
string3

output
'string1'
'string2'
'string3'
Run Code Online (Sandbox Code Playgroud)

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

ste*_*ver 18

这里有几种方法:

  1. 使用八进制转义序列。在'编码为字节 39(八进制 047)的基于 ASCII 的系统上,这将是:

    awk '{print "\047" $0 "\047"}' input
    'string1'
    'string2'
    'string3'
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将引号作为变量传递

     $ awk -v q="'" '{print q $0 q}' input
     'string1'
     'string2'
     'string3'
    
    Run Code Online (Sandbox Code Playgroud)

  • 我从来没有想过“\047”。哇。谢谢。 (2认同)
  • 或者将你的 awk 脚本保存在一个文件 `script.awk` 中以作为 `awk -f script.awk input` 执行,然后你就可以执行 `{ print "'" $0 "'" }` 或 `{ printf "'% s'\n", $0 }`。无法在以 `'` 分隔的脚本中使用 `'`s 是 shell 问题,而不是 awk 问题。 (2认同)

Gil*_*il' 13

在 awk 代码中,只需将撇号放在双引号内。无论这些字符串是如何构造的(文字、变量、字段引用、括号表达式等),您都可以通过将它们彼此相邻(并列)来连接字符串。

{ print "'" $0 "'" }
Run Code Online (Sandbox Code Playgroud)

如果此 awk 代码包含在 shell 脚本中并且 awk 代码位于单引号文字中,则必须安排将单引号字符传递给 awk。使用 single-quote-backslash-single-quote-single-quote'\''在单引号 shell 文字中包含单引号字符。

awk '{ print "'\''" $0 "'\''" }'
Run Code Online (Sandbox Code Playgroud)

或者,在不使用单引号字符的情况下表达 awk 代码。您可以使用反斜杠后跟三个八进制数字来表示 awk 中字符串文字中的任何字符。对于基于 ASCII 的系统上的单引号,那就是\047.

awk '{ print "\047" $0 "\047" }'
Run Code Online (Sandbox Code Playgroud)

  • `awk '{ print "'\''" $0 "'\''" }'` 这太疯狂了。 (2认同)

ilk*_*chu 6

awk 代码只需要是

{ print "'" $0 "'" }
Run Code Online (Sandbox Code Playgroud)

您可以将其放入文件中,这样您就不需要引用任何内容:

$ printf 'a\nb\n' | awk -f quote.awk 
'a'
'b'
Run Code Online (Sandbox Code Playgroud)

或者使用双引号字符串,并对引号和美元符号进行转义:

$ printf 'a\nb\n' | awk "{ print \"'\" \$0 \"'\" }"
Run Code Online (Sandbox Code Playgroud)

或者在 Bash/ksh/zsh 中,使用$'...'引号的形式,这样可以转义里面的单引号:

$ printf 'a\nb\n' | awk $'{ print "\'" $0 "\'" }'
Run Code Online (Sandbox Code Playgroud)


Sté*_*las 6

请注意,您不需要这样做awk

您可以改用paste基本实用程序:

 < input paste -d "'" /dev/null - /dev/null
Run Code Online (Sandbox Code Playgroud)

awk基于或sed基于的解决方案相比,它会更高效且限制更少。