Unix的换行到窗口换行(在Windows上)
-
05-09-2019 - |
题
有谁知道的一种方式(说PowerShell或工具)在Windows中,可以递归通过目录和任何UNIX文件转换为Windows文件。
我会与Powershell的一种方法,至少检测一个UNIX文件完全满意。
这很容易为一个单一的文件做到这一点,但东西有点更具可扩展性(因此向Powershellish解决方案倾斜)。
在我解决方案
下面是纯PowerShell的方式,如果你有兴趣。
查找与截至ATLEAST一个UNIX线(PowerShell的V1)文件:
dir * -inc *.txt | %{ if (gc $_.FullName -delim "`0" | Select-String "[^`r]`n") {$_} }
下面是你如何寻找和隐蔽UNIX行结束到Windows行尾。需要注意的重要一点是,结束一个额外的行(\ r \ n)的将被添加到该文件的末尾如果没有已经在最后结束的行。如果你真的不希望出现这种情况,我会发布的,你如何避免它的一个示例(这是相对比较复杂)。
Get-ChildItem * -Include *.txt | ForEach-Object {
## If contains UNIX line endings, replace with Windows line endings
if (Get-Content $_.FullName -Delimiter "`0" | Select-String "[^`r]`n")
{
$content = Get-Content $_.FullName
$content | Set-Content $_.FullName
}
}
在上述工程因为PowerShell的将自动分割上\ n中的内容(滴加\ R如果存在的话),然后添加\ r \ n时它写入(在这种情况下的线)到文件中的每个事物。这就是为什么你总是在文件的结尾结束的行结束了。
另外,我写上面的代码,使得其仅修改它需要的文件。如果你不关心你可以删除if语句。哦,确保只有文件获取到的foreach对象。除此之外,你可以做任何过滤你想在这条管道的起点。
其他提示
有是DOS2UNIX的和unix2dos在 Cygwin的。
这似乎为我工作。
Get-Content Unix.txt | Out-File Dos.txt
VIM ,打开您的文件和问题
:se fileformat=dos|up
批量为多个文件(在C *所有.txt文件:\ TMP - 递归):
:args C:\tmp\**\*.txt
:argdo se fileformat=dos|up
您可以使用Visual Studio。文件 - >高级保存选项...
如果Cygwin的是不适合你,也有Windows下unix2dos许多独立的可执行文件,如果你谷歌周围,或者你可以自己写一个,看我类似(转换方向相反)问题的here 。
我花了6小时昨天和今天测试的规模与10,000个文件在一个循环上面给出的代码,其中不乏> 50KB。底线,PowerShell代码是非常低效/慢/不可用大文件和大量文件。它也不会保留BOM字节。我发现unix2dos 7.2.3是最快的,最实用的解决方案。希望这可以帮助别人,为他们节省时间。
打开在写字板Unix行结尾的一个文件,并保存它会重写所有行尾为DOS。有点费力了大量文件,但它在一段时间的作品不够好几个文件,每一次。
它为我的作品:
Get-ChildItem -Recurse -File | % { $tmp = Get-Content $_; $tmp | Out-File "$_" -Encoding UTF8 }
这个怎么样(具有负回顾后)。如果没有-nonewline,设置内容提出一个额外的`r`n在底部。随着括号,您可以修改同一个文件。
function unix2dos {
(Get-Content -raw $args[0]) -replace "(?<!`r)`n","`r`n" |
set-content -nonewline $args[0]
}
反向会是这样,窗口UNIX文本。
function dos2unix {
(Get-Content -raw $args[0]) -replace "`r`n","`n" |
set-content -nonewline $args[0]
}
示例:
unix2dos file.txt
dos2unix file.txt
如果你有emacs的,可以与ESC-X hexl模式检查。记事本将无法正确显示UNIX文本。我不得不指定设定内容的路径,因为-replace擦除pspath。