在Linux上将CRLF转换为换行


34

在Linux上,将CRLF转换为换行符的最佳方法是什么?

我看过sed命令,但是还有什么更简单的方法吗?


4
Dupe:superuser.com/questions/38744/…。接受的答案中提供的链接涵盖了dos2unix,perl和vi选项。
nagul

2
不过,这已经有了更好的答案(因此,如果其中一个要关闭,则可能应该是那个)
Jonik

Answers:


40

使用此命令:

fromdos yourtextfile

另一种方式:

todos yourtextfile

这些命令可以在tofrodos软件包中找到(在最新发行版中),该软件包还提供了两个包装器unix2dosdos2unix,它们模仿了同名的旧unix工具。


2
+1比目前最受好评的“使用dos2unix”答案有用。
Jonik

1
是的,即使我对此也投了赞成票。我的想法更多地是一个偷偷摸摸的建议。
瑞安·汤普森

如果您说如何使其递归,我将给予额外的奖励。目前仅适用于通配符。
索林

2
@SorinSbarnea:类似find . -name '*.txt' -print0 | xargs -null fromdos
bstpierre

@Jonik是什么让它“有用得多”?严重的问题
andrewtweber

24

使用dos2unix

dos2unix-DOS / MAC至UNIX文本文件格式转换器

dos2unix  [options] [-c convmode] [-o file ...] [-n infile outfile ...]

Options:
          [-hkqV] [--help] [--keepdate] [--quiet] [--version]

2
和unix2dos的另一种方式。
2009年

嘎嘎,你在跟着我吗?并不是所有的投票我都对此表示赞赏。
瑞安·汤普森

1
伙计,我〜嘎嘎。发音为“〜”为“ not”。:)但没有,没有跟随您,但我看来确实经常遇到您。
09年

1
考虑详细说明如何为您的Linux系统获取此实用程序。至少在Ubuntu上,默认情况下未安装它(但通过安装tofrodos软件包,您会得到非常类似的东西:packages.ubuntu.com/jaunty/tofrodos)。
约尼克,

20

我喜欢的Perl

perl -lne 's/\r//g; print' winfile.txt > unixfile.txt

但这很适合我的用法,对我来说很容易记住。并非所有系统都具有dos2unix命令,但是我从事的大多数系统都具有perl解释器。

另一个是recode,它是dos2unix和iconv的强大替代品;它可以在Debian仓库的“ recode”包中找到:

recode ibmpc..lat1 winfile.txt   # dos2unix
recode lat1..ibmpc unixfile.txt  # unix2dos

对于awk粉丝:

awk '{ sub("\r$", ""); print }' winfile.txt > unixfile.txt

...并sed

sed 's/\r$//' winfile.txt > unixfile.txt

现在,与从我们的stackoverflow.com好友之一(可牛肉解释器(位于您友好的邻里Debian存储库中)直接使用)中的十六进制编辑器中手动删除CR相比,仅需花费很少的精力,

dos2unix在脑干

,[[->+>+<<]>>>,[<-------------[+++++++++++++.>>>]<[>>----------[>+++++++++++++.-------------]<++++++++++>]<<<<[-]>>>[-<<<+>>>]]<[-]<[-]<]++++++++++.

非常感谢jk浪费了他一小时的时间来写这篇文章!


1
(猫的无用使用和)perl与sed一样复杂...因此,您并未真正回答问题,而是在收集声望:)
akira

2
“最佳方法”是主观的。这对我来说效果最好(我对perl的感觉比对sed的感觉要舒服得多)。我没有保证它会最适合您。
2009年

@akira:一个问题可以有多个有效答案。我也偶尔使用这种方法,通常将其与其他更改结合使用,因此,这绝对是一个有效的答案。但是在大多数情况下,“使用dos2unix”绝对是更实际的答案。因此,我认为评分很好。
reinierpost,2009年

@akira:如果您觉得更简单,请将其发布为答案,并启发我们其他人。
09年

@〜quack:重点在于:这并不简单。您的perl答案也是如此。u2d或fromdos / todos是正确的答案,因为它们比用任何其他编程语言表达的任何内容都要简单
akira

9

我在Bash上执行此操作:

cat cr_stuffed.file | tr -d \r > no_more_crs.file

很好 今天早些时候,我又看到了tr的提法。这不是一个经常被提及的程序吗?
2009年

7

我认为您也可以使用tr(尽管我没有尝试使用的有趣格式文件):

tr -d '\r' < file1 > file2


4

我找到了一种非常简单的方法…使用nano打开文件:## nano file.txt

按Ctrl + O保存,但在按Enter之前,请按:Alt + D切换DOS和Unix / Linux线尾之间,或者:Alt + M切换Mac和Unix / Linux线尾之间,然后按Enter保存并Ctrl + X退出。


1
您能否编辑答案以阐明哪些切换设置将复制OP要求的行为?
布尔吉

OP希望关闭 DOS行的结尾,因此Alt+d。有时alt会被终端程序拦截,因此您可以改用alt esc+d
2016年

1
按下Shift键也可以使用许多nano快捷方式,这通常可以防止终端拦截,因此'Alt-Shift-D'也可以使用。
mwfearnley

3

我更喜欢Vim:set fileformat=unix。虽然不是最快的,但确实可以预览。对于带有混合结尾的文件,它特别有用。


1

如果要使用GUI方法,请尝试使用Kate文本编辑器(其他高级文本编辑器也可以处理此问题)。打开查找 / 替换对话框(Ctrl+ R),然后替换\r\n\n。(注意:您需要从下拉列表中选择“正则表达式”,然后从选项中取消选择“仅选择”。)

编辑:或者,如果你只是想转换为Unix格式,然后使用菜单选项Tools> End of Line> Unix


有些文本编辑器(例如jEdit)可以自动进行这些转换-您只需要告诉它是否需要Unix,Windows或Mac的行分隔符即可。
约尼克,

实际上,KATE也可以通过“ 工具”>“行尾”菜单执行此操作。也许我应该比完全按照措辞回答问题更侧重思考-但是,如果您知道要转换成特定语言\r\n\n那么使用搜索/替换比记住哪个操作系统使用哪个行尾更容易。;)
DisgruntledGoat

1

将其粘贴到dos2unix.py Python脚本中。

#!/usr/bin/env python
"""\
convert dos linefeeds (crlf) to unix (lf)
usage: dos2unix.py <input> <output>
"""
import sys

if len(sys.argv[1:]) != 2:
  sys.exit(__doc__)

content = ''
outsize = 0
with open(sys.argv[1], 'rb') as infile:
  content = infile.read()
with open(sys.argv[2], 'wb') as output:
  for line in content.splitlines():
    outsize += len(line) + 1
    output.write(line + '\n')

print("Done. Saved %s bytes." % (len(content)-outsize))

应该可以在安装了Python的任何平台上使用。公共区域。


1

CR LFLF使用AWK

awk -v RS='\r?\n' 1
command | awk -v RS='\r?\n' 1
awk -v RS='\r?\n' 1 filename

用法示例:

echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' 1 | hexdump -C

说明:

-v RS='\r?\n'将变量RS(输入 - [R的eCord 小号 eparator)到\r?\n,这意味着输入由线读取线通过LF(分离\n),其可以(?中)可通过CR(前面\r)。

1是awk执行的脚本。脚本由组成condition { action }。在这种情况下,1条件为真。该动作被省略,因此执行默认动作,这意味着打印当前行(也可以写为{print $0}或简单地{print})。


LFCR LF:可以设置变量ORSø安输出 ř的eCord 小号 eparator)修改输出的线端部。例:

echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' -v ORS='\r\n' 1 | hexdump -C

0

我将此脚本用于需要将文件从Windows系统紧急传输到Unix系统的文件。

 find . -type f | xargs file | grep CRLF | cut -d: -f1 | xargs dos2unix

find . -type f

在您从中运行命令的目录中递归查找所有文件

xargs file

将其传递到文件程序以获取文件分析。

grep CRLF

我们只需要显示CRLF 的文件输出。

cut -d: -f1

使输出达到颜色。丢弃其余的。我们现在应该只有一个文件名

xargs dos2unix

使用xargs将文件名传递给程序dos2unix

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.