如何在 AWK 中正确转义单引号

如何在 AWK 中正确转义单引号

目前尚不清楚以下宏中究竟需要转义哪些内容才能使其能够在 FreeBSD 上与 awk 或 sed 一起使用。

define(`RELAY_MAILER_ARGS', `TCP $h 2525')dnl

这是一个 awk 命令,它尝试将上述行插入到SMART_HOST配置下面第 90 行。

awk 'NR==90 { print "define(\`RELAY_MAILER_ARGS\', \`TCP $h 2525\')dnl"}1' example.com.mc

该命令导致以下错误:

Unmatched '"'.

对未来编辑的说明:反引号/单引号不是拼写错误。这是 m4 语言的一个古老怪癖,用于编写 Sendmail 配置的宏:“m4 使用单引号(开头为“`” 结尾为“'”)来引用参数”

附加说明sed:在 FreeBSD 上使用时,八进制转义似乎不起作用。在这种情况下,请使用xNN转义的十六进制字符。

答案1

您无法转义单引号,因为命令本身被单引号包围,但您可以在 POSIX awk 中使用八进制转义码\047来表示'。此外,您可以\x27在 GNU awk 中使用十六进制转义码(gawk)。

GNU Awk 用户指南3.2 转义序列

\nnn

八进制值nnn,其中nnn代表 '0' 和 '7' 之间的 1 到 3 位数字。例如,ASCII ESC(转义)字符的代码为 \033

\xhh…

十六进制值hh,其中hh代表十六进制数字序列('0'–'9',以及 'A'–'F' 或 'a'–'f')。 后面最多允许两位数字\x。 任何其他十六进制数字均视为简单字母或数字。(ce)(\x POSIX awk 中不允许使用转义序列。)

awk 'NR==90 { print "define(\`RELAY_MAILER_ARGS\047, \`TCP $h 2525\047)dnl"}1' example.com.mc

gawk 'NR==90 { print "define(\`RELAY_MAILER_ARGS\x27, \`TCP $h 2525\x27)dnl"}1' example.com.mc

如果您还想使用\140(或\x60)来表示反引号

awk 'NR==90 { print "define(\140RELAY_MAILER_ARGS\047, \140TCP $h 2525\047)dnl"}1' example.com.mc

gawk 'NR==90 { print "define(\x60RELAY_MAILER_ARGS\x27, \x60TCP $h 2525\x27)dnl"}1' example.com.mc

相关内容