【问题标题】:How to escape a single quote inside awk如何在awk中转义单引号
【发布时间】:2012-04-11 13:01:53
【问题描述】:

我想做以下事情

awk 'BEGIN {FS=" ";} {printf "'%s' ", $1}'

但是以这种方式转义单引号不起作用

awk 'BEGIN {FS=" ";} {printf "\'%s\' ", $1}'

如何做到这一点?感谢您的帮助。

【问题讨论】:

  • 许多语言通过将其中两个放在一行来转义引号,也许可以尝试一下。
  • 我试过 awk 'BEGIN {FS=" ";} {printf "''%s'' ", $1}',但没有打印单引号。
  • This Page 表示不可能在单引号字符串中包含单引号。也许您必须转换为双引号。
  • 不可能,但是 两个 相邻的单引号 shell 字符串粘合在一起成为一个参数。由非空白字符粘合的两个单引号外壳字符串也粘合成一个大球:'abc'd'ef'abcdef:文字加上 d 加上文字。 d 在引号之外,您可以将 d 替换为 \' 以生成 'abc'\''ef',其计算结果为 abc'ef

标签: awk


【解决方案1】:

这可能是您正在寻找的:

awk 'BEGIN {FS=" ";} {printf "'\''%s'\'' ", $1}'

也就是说,使用'\'' 关闭开头的',然后通过转义输出文字',最后再次打开'

【讨论】:

  • 跟awk没有关系。 ' 字符关闭开头的 ' shell 字符串文字。 shell 文字不支持反斜杠转义。序列'\'' 起到了作用:它关闭单引号文字,指定引号字符(使用 is 在单引号文字之外支持的转义)然后重新打开一个新的单引号-引用文字。你可以把它想象成一个四字符的转义序列来得到一个单引号。 :)
  • @Steve:非常感谢您非常有用的回答。你让我省了很多麻烦!
  • @syntaxerror 用于准备调用awk 的参数的引号纯粹是您用于编写命令行的命令解释器的问题。 '{printf $2}' 变成了 execve 系统调用或类似的一些参数,它看起来就像一个没有任何单引号的空终止 C 字符串。 awk 永远不会看到引号,sed 也不会。您实际上可以使用双引号,但双引号不会阻止 shell 扩展 $2,因此您必须使用反斜杠转义美元符号以使其变为文字:"{printf \$2}"
  • @syntaxerror 按照惯例,内联 awk 脚本通常用单引号转义,因为 awk 语法通常包含对 shell 而言特殊的词法元素,例如双引号字符串文字和编号字段用美元符号表示。如果 sed 正则表达式(或其他)包含 shell 语法,您还必须小心。如果打算用$BAR 替换文字文本$FOOsed -e "s/$FOO/$BAR/" 将不起作用。最简单的方法是sed -e 's/$FOO/$BAR/
  • @syntaxerror 如果你把 awk 程序用双引号括起来,你会遇到很多转义,比如awk "{ print \"abc\", \$1 }"。任何时候在 awk 程序中出现双引号时,都必须对其进行转义,以免它关闭 shell 引号。并比较一下:awk '{print "\\"}'(打印反斜杠)与双引号所需要的:awk "BEGIN {print \"\\\\\" }",唷!两个引号都必须转义,两个反斜杠都必须转义。 shell 将\\ 转换为\ ,所以我们需要\\\\ 来编码\\
【解决方案2】:

使用\x27表示单引号

喜欢

awk 'BEGIN {FS=" ";} {printf "\x27%s\x27 ", $1}'

Source

【讨论】:

  • +1,但需要加:\x27是扩展; POSIX Awk 仅识别 \047。 (\47 后面没有八进制数字也可以。)
  • 如果 \x27 后面有另一个数字,你如何结束它?
  • Jason,你连接了两个字符串文字:“AAA\x27”“1”。或者你只使用八进制。
  • 始终使用八进制 (\047),而不是十六进制 (\x27),转义码 - 请参阅 awk.freeshell.org/PrintASingleQuote
【解决方案3】:

另一种选择是将单引号作为 awk 变量传递

awk -v q=\' 'BEGIN {FS=" ";} {printf "%s%s%s ", q, $1, q}'

使用字符串连接的更简单示例:

# Prints 'test me', *including* the single quotes.
$ awk -v q=\' '{print q $0 q }' <<<'test me'
'test me'

【讨论】:

  • 这句话简洁明了,尤其是当你需要使用很多引号时。
【解决方案4】:
awk 'BEGIN {FS=" "} {printf "\047%s\047 ", $1}'

【讨论】:

  • 只要我记得\047 是单引号字符的八进制转义序列,我发现这个替代方案是最易读的。
【解决方案5】:

对于小型脚本,使其可读的一种可选方法是使用如下变量:

awk -v fmt="'%s'\n" '{printf fmt, $1}'

在我不得不在输出中多次生成单引号字符并且\047 使其完全无法读取的情况下,我发现它很方便。

【讨论】:

    【解决方案6】:

    当你在命令行中使用 awk 时,你不必使用 BEGIN 块来定义字段分隔符(FS)你只能使用 -F" " like:

    awk -F" " {printf "\047%s\047 ", $1}'
    

    为您节省一些打字时间。 :)

    【讨论】:

      猜你喜欢
      • 2020-12-27
      • 1970-01-01
      • 2015-07-31
      • 2023-04-02
      • 1970-01-01
      • 2021-10-09
      相关资源
      最近更新 更多