Windows vs. Unix:那些讨厌的行终止符

当我从Unix系统迁移到Windows系统时,除了必须在"/"和"\"之间切换之外,最恼人(而且似乎毫无意义)的区别之一是这两个竞争的操作系统坚持在文本文件中终止行。

Unix系统使用一个字符——换行符——而Windows系统同时使用回车和换行符(通常称为“CRLF”)。作为一个“越简单越好”的人,我更喜欢Unix方法。知道我有时不得不时不时地处理CRLF文件,但是,我尝试准备一些简单的命令来检测,并在需要时更改我正在处理的文件。

要判断Unix系统上的文件是否使用了CRLF约定,最简单的方法是使用file命令问问题。

txt: ASCII文本,带有CRLF行终止符

这很简单。file命令清楚地标识使用Windows约定的文件。对于只使用换行符的文件,你会看到如下内容:

$ file junk2 junk2: ASCII码

如果你想用一个方便的命令查看一组文件,你只需要将file命令的输出发送到grep:

$ file * | grep CRLF DarkBeers.txt: ASCII文本,带CRLF行终止符Lab1: ASCII文本,带CRLF行终止符lab6: ASCII英文文本,带很长的行,带CRLF, CR, LF行终止符,带转义序列,带显著的me-dos.txt: ASCII文本,带CRLF行终止符typescript:ASCII文本,带CRLF, LF行终止符,随便什么ASCII文本,带CRLF, LF行终止符

如果想要查看整个文件结构,可以使用find命令并使用exec选项来运行file命令。然后添加一个管道并查找我们在上面的命令中看到的CRLF标识符。

发现美元。-type f -exec file "{}" ";"| grep CRLF ./whatever: ASCII text, with CRLF, LF line terminators ./lab6: ASCII English text, with very long lines, with CRLF, CR, LF line terminators, with escape sequences, with overstriking ./bin/ CRLF: ASCII text, with CRLF line terminators ./bin/typescript: ASCII text, with CRLF, LF line terminators ./lab6: ASCII English text, with CRLF, CR, LF line terminators, with overstriking ./bin/ CRLF: ASCII text, with CRLF line terminators ./bin/typescript: ASCII text, with CRLF, LF line terminators ./lab6: ASCII English text, with CRLF, CR, LF line terminators, with overstriking ./bin/ CRLF:ASCII文本,带有CRLF行终止符

如果您想查看文件中的回车换行序列,可以使用od(八进制dump)命令显示它们。在下图中,回车(15的八进制,显示为\r)和换行符(12的八进制,显示为\n)用红色突出显示。

crlf1 桑德拉H-S

那么,如何将文件从一种形式的行结束符转换为另一种形式呢?大多数Unix系统都包括两个实用程序——dos2unix和unix2dos——用于将文件从一种格式转换为另一种格式。他们会“在适当的地方”做出改变。换句话说,您不必生成第二个文件,然后重命名它以返回原始文件。

请注意,日期/时间字段将反映您进行更改的日期时间。如果不希望更改时间戳,可以使用-k或-keepdate选项,如下面的第二组命令所示。

$ dos2unix: convert file DarkBeers.txt to UNIX format…$ ls -l DarkBeers.txt -rw-r----- 1 shs staff 116 8月15日17:06
$ ls -l DarkBeers.txt -rw-r----- 1 shs staff 120 Jan 5 2015 DarkBeers.txt $ dos2unix -k DarkBeers.txt dos2unix: convert file DarkBeers.txt to UNIX…$ ls -l DarkBeers.txt -rw-r----- 1 shs staff 116 Jan 5 2015年1月5日

还有其他一些方法可以确定一个文件是否包含Windows样式的行终止符。在下面的awk命令中,我们必须查看返回代码,以确定awk是否在文件中发现了一个回车(\r)。

$ grep -q $ ` \r ` DarkBeers.txt && echo dos dos $ [[$(file -b - < DarkBeers.txt) =~ CRLF]] && echo dos dos $ awk ` /\r$/ {exit(1)}' DB.txt $ echo $?1

您还可以自动化将文件从Windows (DOS)转换为Unix格式的过程,以节省您自己的一点麻烦。下面是一个脚本,它检查是否需要转换,根据需要执行转换,并确保时间戳不会更改。

#!/bin/bash if [$# == 0]; /bin/bash$1 fi file $file | grep CRLF > /dev/null if [$?! = 0);然后dos2unix -k $file fi

在下面的命令中,该脚本用于转换DarkBeers.txt文件。其他命令用于显示文件的时间戳没有改变。它们还显示文件的大小略有变化。毕竟,这个文件的Unix版本已经去掉了回车,所以它要小四个字符。

$ ls -l DarkBeers.txt -rw-r----- 1 shs staff 120 Jan 5 2015 DarkBeers.txt $ ./fixit file> DarkBeers.txt dos2unix: convert file DarkBeers.txt to UNIX format…$ ls -l DarkBeers.txt -rw-r----- 1 shs staff 116 Jan 5 2015 DarkBeers.txt: ASCII文本

我仍然希望只有一种方式结束文本文件中的一行,但至少将文件从一种格式移动到另一种格式是简单的,您可以轻松地避免更改文件的时间戳。

加入网络世界社区有个足球雷竞技app脸谱网LinkedIn对自己最关心的话题发表评论。

版权©2016Raybet2

SD-WAN买家指南:向供应商(和您自己)提出的关键问题