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

Getting linux command syntax with escaped quotes correct from R

我正在尝试在 R 中构建一个 linux sendemail 命令,使用来自联系表单的一堆值的粘贴。消息部分将包含单 and/or 双引号。基于此 post (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 只需要一个反斜杠。

当然,我可以从邮件中删除单引号和双引号,这样就可以了。不过,如果可能,我更愿意保留消息 "as is"。

gsub 和 paste 甚至可以做到这一点吗?

这是我正在做的代码片段:

 message = gsub("\'", "\\'", input$mailAndStoreModalText)
 message = gsub("\"", "\\"", message)
 print( message)

如果我的输入是 - 这是 "best" 音乐 - 上面的 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))

如果你链接 gsubs,你应该第二次传递 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).