如何在awk中转义单引号


110

我想做以下

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

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

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

这该怎么做?感谢帮助。


许多语言通过将其中两个排成一行来避免使用引号,也许可以尝试一下。
joshuahealy 2012年

我尝试了awk'BEGIN {FS =“”;} {printf“''%s”“,$ 1}',但是没有打印单引号。

该页面说不可能在单引号中包含单引号。也许您必须将其转换为双引号。
joshuahealy 2012年

2
这是不可能的,但是两个相邻的单引号壳字符串会粘在一起成为一个参数。由非空格字符粘合的两个单引号外壳字符串也粘合到一个大的glob中:'abc'd'ef'is abcdef:文字d加文字。该d是引号的外面,你可以替换d\',使'abc'\''ef'计算结果为abc'ef
卡兹(Kaz)2012年

Answers:


160

这可能是您想要的:

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

也就是说,'\''关闭开口',然后'转义输出文字,最后'再次打开。


47
它与awk无关。该'字符关闭打开的'外壳程序字符串文字。为此,shell文字不支持反斜杠转义。该序列'\''的伎俩:它关闭单引号的文字,指定引号字符(使用转义支持单引号的文字之外),然后重新打开一个新的单引号的文字。您可以将其视为四字符转义序列以获取单引号。:)
Kaz 2012年

2
@Steve:非常感谢您的有用回答。你让我省了很多麻烦!
John Slegers 2014年

4
@syntaxerror在准备调用参数时使用的引号awk完全是用来编写命令行的命令解释器的问题。将'{printf $2}'gets变成execve系统调用或类似调用的某个参数,它看起来像一个以空终止的C字符串,没有任何单引号。Awk从未看到引号,也没有sed。实际上,您可以使用双引号,但双引号不会阻止shell的扩展$2,因此必须用反斜杠将美元符号转义以使其成为文字:"{printf \$2}"
哈兹2015年

4
@syntaxerror按照习惯,嵌入式awk脚本通常使用单引号转义,因为awk语法通常包含外壳程序专用的词法元素,例如双引号字符串文字和用美元符号表示的编号字段。如果sed正则表达式(或其他任何东西)包含shell语法,则还必须小心。sed -e "s/$FOO/$BAR/"如果目的是替换文字文本将无法正常工作$FOO$BAR。最简单的方法是sed -e 's/$FOO/$BAR/
卡兹2015年

1
@syntaxerror如果将awk程序用双引号引起来,则会遇到很多转义,例如awk "{ print \"abc\", \$1 }"。每当awk程序中出现双引号时,都必须对其进行转义,以免关闭外壳引号。并比较一下:(awk '{print "\\"}'打印一个反斜杠)与双引号所需要的内容:awk "BEGIN {print \"\\\\\" }",Ph!两个引号都必须转义,并且两个反斜杠都必须转义。shell转换\\ 为,\ 因此我们需要\\\\ 编码\\
哈兹2015年

76

单引号表示为 \x27

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

资源


16
+1,但需要添加:\x27是扩展名;POSIX Awk仅识别\047。(\47如果不紧跟八进制,​​也可以。)
hemflit 2013年

1
如果后面还有另一个数字,该如何结尾\ x27?
Jason Axelson

1
杰森,您连接了两个字符串文字:“ AAA \ x27”“ 1”。或者您只使用八进制。
hemflit 2014年

9
始终使用八进制(\047)而不是十六进制(\x27)的转义码-请参阅awk.freeshell.org/PrintASingleQuote
Ed Morton'8

35

另一种选择是将单引号作为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'

5
这是简洁明了的,尤其是在您需要使用许多引号的情况下。
Peter Gluck

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

1
只要我记得这\047是单引号字符的八进制转义序列,我就会发现此替代方法最易读。
Anthony Geoghegan

4

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.