从R中获取带有转义引号的linux命令语法

时间:2017-11-16 20:51:18

标签: r escaping gsub single-quotes

我正在尝试使用来自联系表单中的一堆值的粘贴在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))

1 个答案:

答案 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)。