如何从Windows编写R中的Unix EOL

时间:2015-03-04 20:12:44

标签: r

我需要更新几个脚本,用另一个替换静态值。目前我正在研究R for windows,虽然得到了我需要的输出,但我无法摆脱输出上的 ^ M 字符。

这是我的代码:

setwd("/home/scripts/")
filesInFolder <- list.files(path=".", pattern="\\.k$", recursive=TRUE)
for( currentFile in filesInFolder ){
    fileContent <- readLines(currentFile)
    varToReplace <- "WORKDIR"
    varReplacement <- "$MY_VAR"
    strToSearch <- paste("(.*\\/)(", varToReplace, ")(\\/.*)", sep="")
    #"(.*\\/)(WORKDIR)(\\/.*)"
    strReplacement <- paste( "\\1", varReplacement, "\\3", sep="")
    #"\\1$MY_VAR\\3"
    newFileContent <- gsub(strToSearch, strReplacement, fileContent )
    print(newFileContent)
    currentFile <- paste(currentFile, "b", sep="")
    cat(newFileContent, file=currentFile, sep="\n")
}

这是我正在阅读的文件之一:

#!/bin/ksh

CURRENT_DIRECTORY=/WORKDIR/something

ls $CURRENT_DIRECTORY
#some logic
#more logic

这是我得到的输出文件:

#!/bin/ksh^M
^M
CURRENT_DIRECTORY=/$MY_VAR/something^M
^M
ls $CURRENT_DIRECTORY^M
#some logic^M
#more logic^M

由于我必须更换大约200多个这个值的实例,我想让它自动化。我知道有一些叫做 dos2unix 的东西,但正如我所说,我正在开发Windows,因为这些文件将被上传到存储库并从那里下载,我需要上传它们,将它们下载到Linux机器中并重新上传。我也不能在Linux中使用R.

感谢。

修改 源文件已经有Unix格式 - 我可以在Notepad ++上看到它 - 问题在于输出。

1 个答案:

答案 0 :(得分:0)

我能够做我想做的事,但我不太确定它是最佳解决方案。

setwd("/home/scripts/")
filesInFolder <- list.files(path=".", pattern="\\.k$", recursive=TRUE)
for( currentFile in filesInFolder ){
    fileContent <- readLines(currentFile)
    varToReplace <- "WORKDIR"
    varReplacement <- "$MY_VAR"
    strToSearch <- paste("(.*\\/)(", varToReplace, ")(\\/.*)", sep="")
    #"(.*\\/)(WORKDIR)(\\/.*)"
    strReplacement <- paste( "\\1", varReplacement, "\\3", sep="")
    #"\\1$MY_VAR\\3"
    newFileContent <- gsub(strToSearch, strReplacement, fileContent )
    charVector <- strsplit(newFileContent,"")
    rawFileContent <- NULL
    for(currentString in charVector)
    {
        currentString <- unlist(lapply(currentString, charToRaw))
        #convert every char to raw
        rawFileContent <- c(rawFileContent, currentString, charToRaw("\n"))
        #concatenate raw string with \n, to differentiate strings
    }   
    currentFile <- paste(currentFile, "b", sep="")
    fileConn <- file(currentFile, "wb")
    writeBin(rawFileContent, fileConn)  
    close(fileConn)
}