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

Mai*_*oID 71 linux windows end-of-line

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

要转换为UTF-8,我使用了重新编码程序:

find Web -iname \*.java | xargs recode CP1252...UTF-8
Run Code Online (Sandbox Code Playgroud)

此命令会出现此错误:

recode: Web/src/br/cits/projeto/geral/presentation/GravacaoMessageHelper.java failed: Ambiguous output in step `CR-LF..data
Run Code Online (Sandbox Code Playgroud)

我已经关注它并在此处获得解决方案:http://fvue.nl/wiki/Bash_and_Windows#Recode:_Ambiguous_output_in_step_.60data..CR-LF.27 它说:

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

很好,但我有很多文件要删除CR/LF字符,我无法打开每个人来做它.Vi不为bash操作提供命令行的任何选项.

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

谢谢=)

cHa*_*Hao 110

应该有一个调用的程序dos2unix可以为你修复行结尾.如果它不在你的Linux机器上,它应该可以通过包管理器获得.

  • 我已经提供了提供fromdos命令的tofrodos,但问题仍然存在.fromdos -a GravacaoMessageHelper.java; 重新编码CP1252 ... UTF-8 GravacaoMessageHelper.java返回:recode:GravacaoMessageHelper.java失败:步骤`CR-LF..data'的输出不明确 (2认同)

Jic*_*hao 80

sed无法匹配\n因为在将行放入模式空间之前删除了尾部换行但可以匹配\ r \n,因此您可以通过删除\ r \n将\ r \n(dos)转换为\n(unix)

sed -i 's/\r//g' file
Run Code Online (Sandbox Code Playgroud)

警告:这将更改原始文件

但是,您无法通过此方式从unix EOL更改为dos或旧mac(\ r \n).更多阅读材料:

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

  • +1这是一个很好的解决方案!但你应该注意**`sed -i`将改变原始文件**!因为人们不希望"sed"表现得如此,所以这里警告是合适的.没有多少人知道`-i`所以他们会尝试`sed -i ... file> file2`并且不要指望修改原始文件. (4认同)

Ara*_*dur 16

实际上,vim确实允许你正在寻找的东西.输入vim,然后键入以下命令:

:args **/*.java
:argdo set ff=unix | update | next
Run Code Online (Sandbox Code Playgroud)

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

  • 将行尾设置为Unix样式(你已经知道了)
  • 如果文件已被更改,则将文件写出
  • 继续下一个文件

  • 我:: heart ::我的vim.这次真是万分感谢. (2认同)

Kei*_*thL 9

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
Run Code Online (Sandbox Code Playgroud)

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


Joh*_*hir 7

我将对智超的回答略有例外。实际上,您可以轻松地完成他刚才谈到的所有事情。而不是寻找\ n,只需在行尾查找换页。

sed -i 's/\r$//' ${FILE_NAME}
Run Code Online (Sandbox Code Playgroud)

要从Unix更改为dos,只需查找该行的最后一个字符并向其中添加换页。(我将添加-r以使grep正则表达式更容易实现。)

sed -ri 's/(.)$/\1\r/' ${FILE_NAME}
Run Code Online (Sandbox Code Playgroud)

从理论上讲,可以通过在最后一个示例中添加代码来将文件更改为mac样式,该示例还将输入的下一行追加到第一行,直到处理完所有行。不过,我不会在这里举这个例子。

警告: -i更改实际文件。如果要进行备份,请在-i之后添加一个字符串。这会将现有文件移动到与您的字符添加到最后的同名文件。

  • 我喜欢你的建议,但它只是缺少一个结束单引号。它应该是: sed -ri 's/(.)$/\1\r/' ${FILE_NAME} (2认同)
  • @mgouin 感谢您注意到这一点。我添加了缺少的单引号。 (2认同)

V_V*_*V_V 6

为了克服

Ambiguous output in step `CR-LF..data'
Run Code Online (Sandbox Code Playgroud)

简单的解决方案可能是添加-f标志以强制转换.