我正在尝试使用来自联系表单中的一堆值的粘贴在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只需要一个反斜杠。
当然,我可以从邮件中删除单引号和双引号,它会起作用。我宁愿保留消息"按原样#34;如果可能的话。
这是否可以使用gsub和粘贴?
以下是我正在做的代码片段:
message = gsub("\'", "\\\'", input$mailAndStoreModalText)
message = gsub("\"", "\\\"", message)
print( message)
如果我的意见是 - 这是最好的"音乐 - 上面的gsubs只会产生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))
答案 0 :(得分:1)
如果你链接gsub
,你应该第二次传递message
变量。但是,您可以像这样使用它:
message <- gsub("\"", "\\\"", gsub("\'", "\\\'", input$mailAndStoreModalText, fixed=TRUE), fixed=TRUE)
或者基于正则表达式的替换:
message <- gsub("([\"'])", "\\\\\\1", input$mailAndStoreModalText)
两者都会输出This\'s the \"best\" music
作为输出。
请参阅R demo online。请注意,cat(message, "\n")
命令会显示message
保留的文字字符串,而不是您尝试打印message
时获得的字符串文字。
此外,([\"'])
正则表达式匹配并捕获到第1组"
或'
,"\\\\\\1"
替换模式将整个匹配替换为\
(用4个反斜杠定义)然后是组1中的值(\\1
)。