我是一名Java开发人员,我正在使用Ubuntu进行开发。该项目是在Windows中使用Eclipse创建的,它使用的是CP1252编码。
要转换为UTF-8,我使用了重新编码程序:
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
我已经开始讨论它并在此处获得解决方案:http://fvue.nl/wiki/Bash_and_Windows#Recode:_Ambiguous_output_in_step_.60data..CR-LF.27它说:
将行结尾从CR / LF转换为 single LF:用vim编辑文件, 给出命令:set ff = unix并保存 文件。 Recode现在应该运行 没有错误。
很好,但我有很多文件要删除CR / LF字符,我无法打开每个文件。 Vi不为bash操作提供命令行的任何选项。
sed可以用来做这个吗?怎么样?Thankx =)
答案 0 :(得分:105)
应该有一个名为dos2unix
的程序可以为您修复行结尾。如果它不在你的Linux机器上,它应该可以通过包管理器获得。
答案 1 :(得分:72)
sed无法匹配\ n因为之前删除了尾随换行符 该行被放入模式空间但可以匹配\ r \ n,因此您可以通过删除\ r
将\ r \ n(dos)转换为\ n(unix)sed -i 's/\r//g' file
警告:这会更改原始文件
但是,您无法通过此操作从unix EOL更改为dos或旧mac(\ r \ n)。更多阅读材料:
答案 2 :(得分:15)
实际上,vim确实允许你正在寻找的东西。输入vim,然后键入以下命令:
:args **/*.java
:argdo set ff=unix | update | next
这些命令中的第一个将参数列表设置为每个匹配**/*.java
的文件,这些文件都是递归的Java文件。第二个命令依次对参数列表中的每个文件执行以下操作:
答案 3 :(得分:8)
tr命令也可以这样做:
tr -d'\ 15 \ 32'< winfile.txt> unixfile.txt
并且应该可以使用。
您需要在脚本中运行tr,因为它无法使用文件名。例如,创建一个文件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文件。
答案 4 :(得分:6)
为了克服
Ambiguous output in step `CR-LF..data'
简单的解决方案可能是添加-f
标志以强制转换。
答案 5 :(得分:5)
我对jichao的答案略有例外。你可以很容易地做他刚刚谈到的所有事情。而不是寻找\ n,只需在行尾查找换页。
sed -i 's/\r$//' ${FILE_NAME}
要从unix更改回dos,只需查找该行的最后一个字符并向其添加换页符。 (我将添加-r以使grep正则表达式更容易实现。)
sed -ri 's/(.)$/\1\r/' ${FILE_NAME}
理论上,可以通过向最后一个示例添加代码将文件更改为mac样式,该示例还将下一行输入附加到第一行,直到所有行都被处理完毕。不过,我不打算在这里尝试这个例子。
警告: -i更改实际文件。如果要进行备份,请在-i之后添加一串字符。这会将现有文件移动到具有相同名称的文件,并将字符添加到末尾。
答案 6 :(得分:1)
你试过python script by Bryan Maupin found here了吗? (我已经修改了一点,以便更通用)
#!/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
答案 7 :(得分:0)
返回Windows,告诉Eclipse将编码更改为UTF-8,然后返回Unix并在文件上运行d2u
。