将Unix行尾转换为Windows


38

我最近从Linux移回到Windows。我有一些带有CRLF的文件,一些带有LF的文件,还有一些混合的文件。是否有实用程序可以帮助我找到所有Unix接触的文件并将它们转换为正确的CRLF终止文件?

该实用程序必须在Windows而非Linux上运行。我已经搬家了 如果可以避免,我宁愿不安装Cygwin


1
相关内容:请参见superuser.com/questions/38744 superuser.com/questions/27060 superuser.com/questions/52044 ...其中提到的任何工具都可以颠倒来完成您想要做的事情
魁北克吉x德09年

重复的问题
ukanth,2009年

这些所谓的“重复题”中的解决方案都可以在linux平台上运行或执行相反的转换。我没有Linux了。我有窗户。
马修·斯科腾

1
它们都可以通过Cygwin,GnuWin32,UnxUtils等在Windows上使用。我相信有一些Powershell脚本也可以做到这一点,尽管我对其了解不足以提供任何链接。
魁北克吉x德09年

1
@quack:该问题专门指出用户正在使用Windows实用程序在Windows上寻找可以完成这项工作的内容。
Brian Lacy 2010年

Answers:


34

您可以使用unix2dosLinux平台上的实用程序将它们转换。也有unix2dos 适用于Windows的版本

如果您安装了Perl,则也可以使用这种衬板:

perl -p -e 's/\n/\r\n/' < UNIX_LF.txt > WINDOWS_CRLF.txt

我做了类似的事情,但是我使用了python。
马修·斯科腾

2
@Matthew Scouten:所以...您发现了在Windows上运行的Unix实用程序!恭喜!
魁北克吉x德09年

8
是的,没有。我写了自己的爆炸工具。我本来可以做到这一点,但我希望节省30分钟。不幸的是,我对任何可用的实用程序都不满意。我发现最近的文件损坏了目录中的任何二进制文件。
马修·史考特

使用dos2unix和unix2dos进行转换时会出现问题-如果文件混合了CRLF和LF,则可能会发生一些无法替换的情况。
pbies

17

这是一种简单快捷的方法。

将文本文件拖放到Chrome(我对其他浏览器不了解)中,然后将其剪切并粘贴回原始文件中:)


2
呵呵…这个答案让我
大笑

所有浏览器都可以正常读取Unix行尾,包括IE。但是即使那样,写字板也可以做到这一点,现代记事本也可以。这里重要的是如何自动转换多个文件
phuclv

10

我发现最适合递归浏览文件夹,允许文件过滤器并允许简单搜索“ \ r \ n”并将其替换为“ \ n”的记事本Notepad ++

Notepad ++是Windows最好的,免费的开源记事本程序之一。它非常简单而强大。它很好地处理了行尾搜索/替换。承包商使用Linux \ r \ n行尾将一堆.c和.h文件检入到我们的存储库中,但是由于大多数人已经在Windows / Eclipse构建工具上进行了标准化,因此在转换行尾之前,不会生成文件。


8
我认为您已经扭转了局面:linux是\ n,windows是\ r \ n
Matthew Scouten

10
Edit -> EOL Conversion如果要转换的文件数量很少,Notepad ++也具有简单的菜单。
user1071136 2012年

8

使用瑞士锉刀

例如:sfk addcr -dir . -file .txt -norec
在当前目录的所有.txt文件上,将LF结尾更改为Windows的CR / LF,但不在子目录内(不递归)。

但是,该程序的功能远不止于此。


我没有指定,-norec因为我想进行递归,但是看起来并不像
Csaba Toth

6

在Cygwin上,可以使用两个内置实用程序在Unix和“ DOS” AKA Windows文件之间转换:

转换为DOS CR / LF格式:

u2d filename

转换回Unix CR格式:

d2u filename

该文件将保留相同的名称。

请享用!里克


这有时被称为,dos2unix或者unix2dos如果您找不到它作为u2d或d2u。还有unix2mac
gtatr

3

我将把这种解决方案扔在那里。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

如果要换另一种方法,请更改crlflf。注意:您尚未完成,请继续阅读

键入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。这只是因为文件已被删除,最好备份它们起来


1

如果您不需要转换所有文件中的所有行尾,但是不想在第一行看到整个文件,请使用能够理解两个行尾的文本编辑器,例如SciTENotepad ++


当我在切换到linux时遇到反问题时,他们就是这么说的。我一直遇到行尾错误的工具。并且NOTHING会合理地处理混合行的结尾。
马修·史考登

@马修我知道这个场景处理正确的Unix / Windows行的结尾。在主机系统上编辑文件时,我在linux中运行的Windows vm中将其用于此目的。
nelaaro 2011年

我确信您推荐的编辑器可以正常工作。但是在某些时候,我需要将文本文件输入其他工具,而该工具不会。到那时,拥有一个能够很好地处理事情的文本编辑器会因为隐藏问题而使情况变得更糟。而且我敢打赌,它仍然不能很好地处理混合的结尾(或至少有怪癖)。
马修·史考特

1
+1为notepad ++选项可转换谎言结尾。这里是如何做更具体的(见“法2”):staffwww.fullcoll.edu/brippe/csci123/saveAsUnix.aspx
WIP

Notepad ++已经具有转换行尾和编码的解决方案
phuclv

0

有许多方法可以翻译TEXT文件中的eoln字符,并且每个人都很喜欢。

但是我总是以BINARY模式将文件从Linux传输到Windows,然后使用能够打开这两种类型并在必要时以两种形式保存的编辑器在Windows中打开TEXT文件。

我为此使用了程序员文件编辑器,但Notepad ++也可以做到这一点。写字板也很有用(至少用于查看 LF终止文件)。

我在考虑的简单文本文件可能起源于Linux,并且需要在Windows(事实上的标准)世界中可读。我不确定“ unix-touched files”是什么意思。


这种方法的问题在于它一次只处理一个文件。
马修·斯科腾

我所说的“ unix-touched文件”既指纯LF文件,也​​指混合CRLF-LF文件。在unix-oid工具中编辑了文件后,它往往会受到仅LF行的“感染”。
马修·斯科腾

2
真正要说的是,通过选择合适的软件来查看文本文件,根本不需要对它们进行转换。顺便说一句,我避免让您承担将CRLF终止文件描述为“正确”的任务。这完全取决于您的观点。每种方法都适用于自己的操作系统。将文件移动到其他操作系统时,我们发现Win / Mac / Linux完全不同。我怀疑Unix / Linux方法是原始方法。
pavium

3
你怀疑错了。ASCII标准最初是为电传打字机开发的,并强制采用CRLF。大多数Internet协议(包括HTTP,SMTP,FTP,IRC和许多其他协议)也需要CRLF结尾(大多数实现接受裸LF以与不兼容的Unix程序兼容)。在这种情况下,Windows遵循该标准,而Unix和Mac则在破坏它。
马修·史考登


0

获取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

资源


0

在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)

也可以在Windows中已经提供的VBScriptJScript工具中执行此操作,而无需安装第三方应用程序。


0

我的Linux发行版有两个小实用工具叫fromdostodos我使用的这个任务。


OP要求使用Windows工具
phuclv

-2

我曾经在'edit'中打开文件并保存,因为工作已经完成...


什么是“编辑”?Windows 10中没有这样的工具
phuclv


显然我已经edit在DOS中使用过,但是这个问题是关于Windows的
phuclv

1
edit过去一直是Windows的一部分Windows XP。我的回答是大约8岁。在edit许多情况下,那时那个时候是Windows安装的一部分...
Radek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.