如何在Unix行结束(CR / LF到LF)转换Windows行尾

我是一名Java开发人员,我正在使用Ubuntu进行开发。 该项目是使用Eclipse在Windows中创build的,并使用CP1252编码。

要转换为UTF-8,我使用了recode程序:

find Web -iname \*.java | xargs recode CP1252...UTF-8 

这个命令给出了这个错误:

 recode: Web/src/br/cits/projeto/geral/presentation/GravacaoMessageHelper.java failed: Ambiguous output in step `CR-LF..data 

我已经深入了解,并在这里得到解决scheme: http ://fvue.nl/wiki/Bash_and_Windows#Recode:_Ambiguous_output_in_step_.60data..CR-LF.27它说:

将行结束符从CR / LF转换为单个LF:使用vim编辑文件,给出命令:set ff = unix并保存文件。 现在重新编码应该运行没有错误。

不错,但我有很多文件来删除CR / LF字符,我不能打开每个去做。 Vi不提供任何选项来命令行进行bash操作。

sed可以用来做这个吗? 怎么样 ?

Thankx =)

应该有一个名为dos2unix的程序,将为您修复行结尾。 如果它不在你的Linux机器上,它应该可以通过软件包pipe理器来使用。

sed不能匹配\ n,因为在将行放入模式空间之前删除了尾随的换行符,但可以匹配\ r,因此可以通过删除\ r来将\ r \ n(dos)转换为\ n(unix)

 sed -i 's/\r//g' file 

警告:这将改变原始文件

但是,您不能从unix EOL更改为dos或旧的mac(\ r)。 更多的读物在这里:

如何使用sedreplace换行符(\ n)?

其实,vim确实允许你在找什么。 inputvim,然后input以下命令:

 :args **/*.java :argdo set ff=unix | update | next 

这些命令中的第一个将参数列表设置为每个匹配**/*.java (即所有Java文件)的文件,recursion地。 其中的第二个命令依次为参数列表中的每个文件执行以下操作:

  • 将行结束符设置为Unix样式(您已经知道这一点)
  • 写入文件,如果它已被更改
  • 进入下一个文件

tr命令也可以这样做:

tr -d'\ 15 \ 32'<winfile.txt> unixfile.txt

并应该可以提供给你。

您需要从脚本内运行tr,因为它不能处理文件名。 例如,创build一个文件myscript.sh:

 #!/bin/bash cd ${1} for f in `find -iname \*.java`; do echo $f tr -d '\15\32' < $f > $f.tr mv $f.tr $f recode CP1252...UTF-8 $f done 

运行myscript.sh Web将处理文件夹Web中的所有Java文件。

为了克服

 Ambiguous output in step `CR-LF..data' 

简单的解决scheme可能是添加-f标志来强制转换。

对于超超的回答,我会有一点例外的。 你实际上可以做一切他刚刚谈到的事情。 而不是寻找一个\ n,只要在行的末尾寻找换页。

 sed -i 's/\r$//' ${FILE_NAME} 

要从unix更改为dos,只需查找行上的最后一个字符,然后添加一个换页符。 (我将添加-r,以使grep正则expression式更容易。)

 sed -ri 's/(.)$/\1\r/ ${FILE_NAME} 

理论上,可以通过向最后一个示例添加代码来将文件更改为mac样式,该代码还会将下一行input附加到第一行,直到处理完所有行。 不过,我不会在这里做这个例子。

警告: -i更改实际的文件。 如果要备份,请在-i后面添加一个string。 这将把现有的文件移动到一个与你的angular色名称相同的文件中,并添加到最后。

回到Windows,告诉Eclipse将编码更改为UTF-8,然后返回到Unix并在d2u上运行d2u

你有没有尝试Bryan Maupin在这里find的Python脚本 ? (我已经修改它有点更通用)

 #!/usr/bin/env python import sys input_file_name = sys.argv[1] output_file_name = sys.argv[2] input_file = open(input_file_name) output_file = open(output_file_name, 'w') line_number = 0 for input_line in input_file: line_number += 1 try: # first try to decode it using cp1252 (Windows, Western Europe) output_line = input_line.decode('cp1252').encode('utf8') except UnicodeDecodeError, error: # if there's an error sys.stderr.write('ERROR (line %s):\t%s\n' % (line_number, error)) # write to stderr try: # then if that fails, try to decode using latin1 (ISO 8859-1) output_line = input_line.decode('latin1').encode('utf8') except UnicodeDecodeError, error: # if there's an error sys.stderr.write('ERROR (line %s):\t%s\n' % (line_number, error)) # write to stderr sys.exit(1) # and just keep going output_file.write(output_line) input_file.close() output_file.close() 

您可以使用该脚本

 $ ./cp1252_utf8.py file_cp1252.sql file_utf8.sql