目前尚不清楚以下宏中究竟需要转义哪些内容才能使其能够在 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
)。
\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