如何逃避awk中的单引号

95 awk

我想做以下事情

awk 'BEGIN {FS=" ";} {printf "'%s' ", $1}'
Run Code Online (Sandbox Code Playgroud)

但是以这种方式逃避单引号是行不通的

awk 'BEGIN {FS=" ";} {printf "\'%s\' ", $1}'
Run Code Online (Sandbox Code Playgroud)

这该怎么做?感谢帮助.

Ste*_*eve 144

这可能是你正在寻找的:

awk 'BEGIN {FS=" ";} {printf "'\''%s'\'' ", $1}'
Run Code Online (Sandbox Code Playgroud)

也就是说,当'\''你关闭开口',然后'通过逃避它打印文字,最后再打开'.

  • 它与awk无关.```字符关闭开头`'`shell字符串文字.shell文字不支持反斜杠转义.序列`'\''`诀窍:它关闭单引号文字,指定引号字符(使用单引号文字之外*支持的转义)然后重新打开一个新的单引号文字.您可以将其视为一个四字符转义序列来获得单引号.:) (42认同)
  • @syntaxerror你用来为调用`awk`准备参数的引用纯粹是你用来编写命令行的命令解释器的问题.``{printf $ 2}'`变成了一个`execve`系统调用或类似的参数,它只是看起来像一个空终止的C字符串而没有任何单引号.Awk从未见过报价,也没有看到报价.实际上你可以使用双引号,但双引号不会阻止shell扩展`$ 2`,所以你必须用反斜杠转义美元符号才能使它成为字面值:``{printf\$ 2}"`. (4认同)
  • @syntaxerror根据自定义,内联awk脚本通常使用单引号进行转义,因为awk语法通常包含shell特有的词法元素,例如双引号字符串文字和美元符号表示的编号字段.如果sed正则表达式(或其他)包含shell语法,则还必须小心.`sed -e"s/$ FOO/$ BAR /"`如果意图用'$ BAR`替换文字文本`$ FOO`将不起作用.最简单的方法是`sed -e's/$ FOO/$ BAR /`. (4认同)
  • @Steve:非常感谢你非常有用的答案.你救了我很多头疼的事! (2认同)

小智 71

使用表示单引号 \x27

awk 'BEGIN {FS=" ";} {printf "\x27%s\x27 ", $1}'
Run Code Online (Sandbox Code Playgroud)

资源

  • +1,但需要添加:`\ x27`是一个扩展名; POSIX Awk只识别`\ 047`.(`\ 47`如果没有后跟八进制数字也可以.) (14认同)
  • 始终使用八进制('\ 047`),而非十六进制('\ x27`),转义码 - 看http://awk.freeshell.org/PrintASingleQuote. (9认同)

mkl*_*nt0 34

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

awk -v q=\' 'BEGIN {FS=" ";} {printf "%s%s%s ", q, $1, q}'
Run Code Online (Sandbox Code Playgroud)

更简单的例子:

# Prints 'test me', *including* the single quotes.
$ awk -v q=\' '{print q $0 q }' <<<'test me'
'test me'
Run Code Online (Sandbox Code Playgroud)

  • 这很简洁,特别是如果你需要使用很多引号. (5认同)

小智 13

awk 'BEGIN {FS=" "} {printf "\047%s\047 ", $1}'
Run Code Online (Sandbox Code Playgroud)


use*_*042 7

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

awk -v fmt="'%s'\n" '{printf fmt, $1}'
Run Code Online (Sandbox Code Playgroud)

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