从 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))
如果你链接 gsub
s,你应该第二次传递 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
).
我正在尝试在 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))
如果你链接 gsub
s,你应该第二次传递 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
).