【发布时间】:2017-11-16 20:51:18
【问题描述】:
我正在尝试使用来自联系表单的一堆值的粘贴在 R 中构建一个 linux sendemail 命令。消息部分将包含单引号和/或双引号。根据这篇文章 (How to escape double quote inside a double quote?),我确定我需要完成已经打开的一个 ('),放置转义的一个 (\'),然后打开另一个 (')。
例如,当直接从 linux 命令行运行时(使用实际电子邮件地址时),此方法有效:
sendemail -f mary@test.com -t bob@test.com -u 'Subject here' -m 'My message'\''s text has single quote or maybe "double quotes".' -s smtp.gmail.com:587 -o tls=yes -xu from@mail.com -xp xxxxxx
消息部分来自联系表单,我想通过电子邮件将该消息发送给我们的团队。我尝试使用 gsub 用 '\'' 替换单引号,因此 sendemail 将成功发送消息,但我没有找到正确的 gsub 语法。我已经尝试过这种类型的各种旋转:
gsub("'", "'\''", message)
gsub("\'", "'\\''", message)
等等...我尝试过使用fixed、perl等。我似乎无法获得所需的语法。
我没有反斜杠或 2 个反斜杠,而 sendemail 只需要一个反斜杠。
当然,我可以从消息中删除单引号和双引号,这样就可以了。不过,如果可能,我更愿意“按原样”保留消息。
这甚至可以用 gsub 和粘贴吗?
这是我正在做的代码 sn-p:
message = gsub("\'", "\\\'", input$mailAndStoreModalText)
message = gsub("\"", "\\\"", message)
print( message)
如果我的输入是 - 这是“最好的”音乐 - 上面的 gsub 只会产生相同的结果,但反斜杠为 0。然后这失败了:
team.email = paste0("sendemail -f ", user.email,
" -t ", distr.list,
" -u 'Contact Form Submitted' -m",
" 'Priority: ", priority," ", message,
"' -s smtp.gmail.com:587 -o tls=yes -xu sender@test.com -xp xxxxx")
t <- try(system(team.email, intern = TRUE))
【问题讨论】:
-
你想做什么?将所有
"替换为\"并将'替换为\'? -
sendemail 已引用部分。消息文本由 -m "message text" 表示。如果消息文本也有引号,那么必须转义那些嵌套的引号。似乎linux命令希望以这种方式对嵌套引号进行转义:关闭第一个引号,在嵌入的引号之前使用\,然后重新打开引号。 (根据我引用的那个链接)。我发现这很管用。但是我无法让 R 使用 gsub 和 paste 为我生成它。当尝试使用 gsub 转义引号时,它总是给我 0 个反斜杠或 2 个反斜杠,我需要 1 个才能使 sendemail 工作。
-
玛丽,哪段代码给了你两个反斜杠?我 100% 确定你没有得到 2 个
\s,你只是不明白你看到的实际上是一个\。 -
只是为了让您看到和感受不同之处,请参阅ideone.com/3HJpL4,
gsub("\"", "\\\"", x, fixed=TRUE)将所有"替换为\"。 -
转义单引号 -
gsub("'", "\\'", y, fixed=TRUE).
标签: r escaping gsub single-quotes