我已经多次搜索,但在这里或其他地方找不到答案.我想用一个替换' '包含文件名的变量中的每个空格'\ '.(一个用例可能是shell命令,空格被转义,因此每个文件名都不会显示为参数列表.)我已经查看了StackOverflow问题"如何替换R中的单个反斜杠",并找到了许多组合确实像宣传的那样工作:
> gsub(" ", "\\\\", "a b")
[1] "a\\b"
> gsub(" ", "\\ ", "a b", fixed = TRUE)
[1] "a\\ b"
Run Code Online (Sandbox Code Playgroud)
但尝试使用单斜杠版本,R忽略它:
> gsub(" ", "\\ ", "a b")
[1] "a b"
> gsub(" ", "\ ", "a b", fixed = TRUE)
[1] "a b"
Run Code Online (Sandbox Code Playgroud)
对于相反方向的情况 - 从字符串中删除斜杠,它适用于两个:
> gsub("\\\\", " ", "a\\b")
[1] "a b"
> gsub("\\", " ", "a\\b", fixed = TRUE)
[1] "a b"
Run Code Online (Sandbox Code Playgroud)
但是,对于单斜线,R中的一些内部反常阻止我甚至试图删除它们:
> gsub("\\", " ", "a\\b")
Error in gsub("\\", " ", "a\\b") :
invalid regular expression '\', reason 'Trailing backslash'
> gsub("\", " ", "a\b", fixed = TRUE)
Error: unexpected string constant in "gsub("\", " ", ""
Run Code Online (Sandbox Code Playgroud)
"无效的正则表达式"告诉我们一些事情,但我看不到什么.(另请注意,该perl = True选项无效.)
即使有三个反斜杠,R也没有注意到一个:
> gsub(" ", "\\\ ", "a b")
[1] "a b"
Run Code Online (Sandbox Code Playgroud)
模式也延伸了!即使是两个工作的倍数:
> gsub(" ", "\\\\\\\\", "a b")
[1] "a\\\\b"
Run Code Online (Sandbox Code Playgroud)
但不是奇数倍(应该得到'\\\ ':
> gsub(" ", "\\\\\\ ", "a b")
[1] "a\\ b"
> gsub(" ", "\\\ ", "a b", fixed = TRUE)
[1] "a\\ b"
Run Code Online (Sandbox Code Playgroud)
(我希望有3条斜线,而不是2条.)
我的两个问题是:
' '用一个'\ '完成取代?对于shell命令,一个简单的解决方法是引用文件名,但我感兴趣的部分只是想了解R的正则表达式引擎发生了什么.
Tim*_*sen 15
准备好面掌,因为这样:
> gsub(" ", "\\\ ", "a b", fixed = TRUE)
[1] "a\\ b"
Run Code Online (Sandbox Code Playgroud)
实际上是在工作.
你看到的两个反斜杠只是R控制台显示单个反斜杠的方式,当打印到屏幕时会被转义.
要确认使用单个反斜杠替换确实有效,请尝试将输出写入文本文件并检查自己:
f <- file("C:\\output.txt")
writeLines(gsub(" ", "\\", "a b", fixed = TRUE), f)
close(f)
Run Code Online (Sandbox Code Playgroud)
在output.txt你应该看到以下内容:
a\b
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11980 次 |
| 最近记录: |