【问题标题】:Getting linux command syntax with escaped quotes correct from R从 R 中获取带有正确转义引号的 linux 命令语法
【发布时间】: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/3HJpL4gsub("\"", "\\\"", x, fixed=TRUE) 将所有" 替换为\"
  • 转义单引号 - gsub("'", "\\'", y, fixed=TRUE).

标签: r escaping gsub single-quotes


【解决方案1】:

如果您链接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)。

【讨论】:

  • 是的,我应该更加小心我的复制/粘贴。我在第二个 gsub 中使用消息。我刚刚尝试过: message
  • @Mary 然后,没有引号。或者有 curly 或其他 Unicode 引号。看看this answer of mine
  • This code 在 Windows 中工作,输出为 -\‟m\” \„message\” \'\ʽtext\’\'\" for x &lt;- "-‟m” „message” 'ʽtext’'\""
  • 非常感谢您的帮助。我还没有让它工作,但我相信我能做到。您引用的另一篇文章很棒,非常有帮助。显然,您在使用 gsub 和特殊字符方面投入了很多时间。我现在知道为什么我的一些搜索/替换似乎不起作用。这是弯引号!我现在用这个: sngl_quot_rx = "['ʻʼʽ٬''‚‛՚︐]" dbl_quot_rx = "["""'〝〞"″‶]" message = gsub(sngl_quot_rx, "", @987654341 @(input$mailAndStoreModalText, "UTF8")) message = gsub(dbl_quot_rx, "", Encoding&lt;-(message, "UTF8"))
  • @Mary 您是在 Windows 还是 Linux 中工作?还是MacOS? This demo 运行良好,只需将您需要的引号添加到括号表达式中即可。
猜你喜欢
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
相关资源
最近更新 更多