我最近从Linux移回到Windows。我有一些带有CRLF的文件,一些带有LF的文件,还有一些混合的文件。是否有实用程序可以帮助我找到所有Unix接触的文件并将它们转换为正确的CRLF终止文件?
该实用程序必须在Windows而非Linux上运行。我已经搬家了 如果可以避免,我宁愿不安装Cygwin。
我最近从Linux移回到Windows。我有一些带有CRLF的文件,一些带有LF的文件,还有一些混合的文件。是否有实用程序可以帮助我找到所有Unix接触的文件并将它们转换为正确的CRLF终止文件?
该实用程序必须在Windows而非Linux上运行。我已经搬家了 如果可以避免,我宁愿不安装Cygwin。
Answers:
您可以使用unix2dos
Linux平台上的实用程序将它们转换。也有unix2dos
适用于Windows的版本。
如果您安装了Perl,则也可以使用这种衬板:
perl -p -e 's/\n/\r\n/' < UNIX_LF.txt > WINDOWS_CRLF.txt
我发现最适合递归浏览文件夹,允许文件过滤器并允许简单搜索“ \ r \ n”并将其替换为“ \ n”的记事本是Notepad ++。
Notepad ++是Windows最好的,免费的开源记事本程序之一。它非常简单而强大。它很好地处理了行尾搜索/替换。承包商使用Linux \ r \ n行尾将一堆.c和.h文件检入到我们的存储库中,但是由于大多数人已经在Windows / Eclipse构建工具上进行了标准化,因此在转换行尾之前,不会生成文件。
Edit -> EOL Conversion
如果要转换的文件数量很少,Notepad ++也具有简单的菜单。
使用瑞士锉刀。
例如:sfk addcr -dir . -file .txt -norec
在当前目录的所有.txt文件上,将LF结尾更改为Windows的CR / LF,但不在子目录内(不递归)。
但是,该程序的功能远不止于此。
-norec
因为我想进行递归,但是看起来并不像
我将把这种解决方案扔在那里。Git将做到这一点。看到关于它的这篇文章
因此,理论上您可以执行此操作以转换整个树
cd root/of/tree
git init .
git add .
git commit -m "initial commit"
echo "* text eol=crlf" > .gitattributes
git rm --cached -r .
git reset --hard
如果要换另一种方法,请更改crlf
为lf
。注意:您尚未完成,请继续阅读
键入git status
以查看哪些文件将受到影响。您可能需要添加以下行
*.jpg binary
*.png binary
*.gif binary
等,以.gitattributes
避免将某些文件。您还可以将某些文件显式标记为文本
*.md text
*.css text
然后在编辑后重复这两行 .gitattributes
git rm --cached -r .
git reset --hard
然后git status
再次使用以查看将要更改的文件。当您确定要受影响的所有文件都被列出后,git status
再提交
git add .
git commit -m "normalize line endings"
现在再次检查所有文件
git rm --cached -r .
git reset --hard
现在,它们应该具有所需的行尾
**注意:如果您已经在使用git,请跳过前3个命令。如果您不使用git,现在可以删除.gitattributes
文件和.git
文件夹。
**备份文件:git rm --cached -r
删除所有文件(尽管理论上它们都在您的git repo(.git文件夹中),这是通过最后一条命令还原它们的方式git reset --hard
。这只是因为文件已被删除,最好备份它们起来
如果您不需要转换所有文件中的所有行尾,但是不想在第一行看到整个文件,请使用能够理解两个行尾的文本编辑器,例如SciTE或Notepad ++。
有许多方法可以翻译TEXT文件中的eoln字符,并且每个人都很喜欢。
但是我总是以BINARY模式将文件从Linux传输到Windows,然后使用能够打开这两种类型并在必要时以两种形式保存的编辑器在Windows中打开TEXT文件。
我为此使用了程序员文件编辑器,但Notepad ++也可以做到这一点。写字板也很有用(至少用于查看 LF终止文件)。
我在考虑的简单文本文件可能起源于Linux,并且需要在Windows(事实上的标准)世界中可读。我不确定“ unix-touched files”是什么意思。
提供更多选项(即使我最喜欢user45832的hack回答):
在线转换器
批处理/ DOS一线式(删除空行):
FOR /F "eol= delims= usebackq" %a IN (infile.txt) DO (ECHO %a>> outfile.txt)
电源外壳:
gc infile.txt | %{$_.split("`n")} | Out-File outfile.txt
从这里得到了最后两个
获取Windows的AWK。
将Unix行尾转换为Windows行尾:
awk 'sub("$", "\r")' unixfile.txt > winfile.txt
将Windows行尾转换为Unix行尾:
awk '{ sub("\r$", ""); print }' winfile.txt > unixfile.txt
较旧的版本awk
不包含该sub
功能。在这种情况下,请使用相同的命令,但awk
要用gawk
或替换nawk
。
在Wikipedia上,cmd中有一个解决方案:
TYPE unix_file | FIND /V "" > dos_file
在PowerShell中,有多种方法可以通过撤消在此问题中所做的操作来做到这一点。
(Get-Content $file -Raw).Replace("`n", "`r`n") | Set-Content $path -Force
(Get-Content $infile) -join "`r`n" > $outfile
$text = [IO.File]::ReadAllText($original_file) -replace "`n", "`r`n"
[IO.File]::WriteAllText($original_file, $text)