如何转换一组文件中的换行符?

如何转换一组文件中的换行符?

我有一组带有 Windows 换行符 ( CRLF) 或 Unix 换行符 ( LF) 的文件。

如何将所有文件中的所有换行符转换为 Mac 换行符(CR)?

答案1

问题没有明确说明,但我假设您的意思是文本文件,并且需要转换行分隔符格式?OS X 没有附带命令行文件转换器工具,您必须自己构建它们。Perl 非常适合这样的 Q&D 实用程序:

perl -pe 'if (s/\r?\n/\r/g) {$f=1}; if ($f&&eof()) {s/\r\z//}' PCfile.txt >Macfile.txt

或者,就地转换:

perl -pe 'if (s/\r?\n/\r/g) {$f=1}; if ($f&&eof()) {s/\r\z//}' -i convertfile.txt

注意:此脚本可能比实际需要的要复杂一些,因为它既适用于 PC 格式(CRLF 行终止符),也适用于 unix 文件(LF 终止符),并且不会影响已经采用旧式传统 MacOS 格式(行间 CR 分隔符)的文件。此外,PC 和 unix 格式在最后一行后放置终止符,而 Mac 格式则不这样做(它使用行分隔符,而不是终止符),因此此脚本会检测实际翻译的时间,并删除最后一个分隔符。

答案2

CR 行尾主要用在 Mac OS 9 及更早版本中。OS X 在大多数地方使用 LF 行尾。

以下某些方法会在未以换行符结尾的文件末尾添加换行符。有些方法在 Windows 上或默认行尾不是 LF 时不起作用。

CRLF 到 LF:

dos2unix *.txt
sed -i '' $'s/\r//' *.txt
tr -d '\r'

LF 到 CRLF:

unix2dos *.txt
recode ../crlf *.txt

LF 至 CR:

unix2mac *.txt
awk 'BEGIN{ORS="\r"};1'
tr '\n' '\r'

CR 转 LF:

mac2unix *.txt
awk 'BEGIN{RS="\r"};1'

CRLF 或 CR 到 LF:

ruby -e 'print gets(nil).gsub /\r\n?/,"\n"'
ruby -i -pe 'BEGIN{$/="\r"};$_=$_.sub("\n","").sub("\r","\n")' *

CRLF 或 LF 至 CR:

ruby -i -ne 'print $_.chomp+"\r"' *.txt

相关内容