从Unix中的文件中删除所有回车符\r的最简单方法是什么?

有帮助吗?

解决方案

我假设你的意思是在结束行的回车( CR "\r"0x0d),而不是盲目地在文件中(你知道,你可以将它们放在琴弦的中间)。仅在第一行末尾使用带有 CR 的测试文件:

$ cat infile
hello
goodbye

$ cat infile | od -c
0000000   h   e   l   l   o  \r  \n   g   o   o   d   b   y   e  \n
0000017
如果系统上安装了

dos2unix,那么

sed就是这样的:

$ cat infile | dos2unix -U | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

如果出于某种原因ed不可用,那么<=>将会这样做:

$ cat infile | sed 's/\r$//' | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

如果出于某种原因<=>不适合您,那么<=>会以复杂的方式进行:

$ echo ',s/\r\n/\n/
> w !cat
> Q' | ed infile 2>/dev/null | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

如果您的盒子上没有安装任何这些工具,那么您遇到的问题比尝试转换文件要大: - )

其他提示

tr -d '\r' < infile > outfile

请参阅 tr(1)

旧学校:

tr -d '\r' < filewithcarriagereturns > filewithoutcarriagereturns

在许多系统上都有一个名为 dos2unix 的实用程序,可以轻松安装大多数人。

在我看来,最简单的Linux方式是

sed -i 's/\r$//g' <filename>

替换运算符's/\r//'周围的强引号必需。如果没有它们,shell会将\r解释为escape + r并将其缩小为普通的r,并删除所有小写/g。这就是为什么 Rob 在2009年给出的答案不起作用的原因。

添加<=>修饰符可确保删除多个<=>,而不仅仅是第一个<=>。

sed -i s/\r// <filename>或某些人;请参阅man sed或网上有关使用sed的大量信息。

要指出的一点是<!>“;回车<!>”的确切含义;在上面;如果你真的是指单个控制字符<!>“;回车<!>”,那么上面的模式是正确的。如果你的意思更一般地说是CRLF(回车和换行,这是在Windows下实现换行的方式),那么你可能想要替换\r\n。 Linux / Unix中的裸线馈送(换行符)是\n

如果您是Vi用户,则可以打开文件并删除回车符:

:%s/\r//g

:1,$ s/^M//

请注意,您应按ctrl-v然后按ctrl-m键入^ M.

再一次解决方案......因为总有一个解决方案:

perl -i -pe 's/\r//' filename

这很好,因为它已经到位并适用于我曾经使用的各种unix / linux。

其他人推荐dos2unix,我也强烈推荐它。我只是提供更多细节。

如果已安装,请跳至下一步。如果尚未安装,我建议通过yum喜欢安装它:

yum install dos2unix

然后你就可以使用它:

dos2unix fileIWantToRemoveWindowsReturnsFrom.txt

这就是事情,

%0d是回车符。使其与Unix兼容。我们需要使用以下命令。

dos2unix fileName.extension fileName.extension

尝试将dos文件转换为unix文件:

  

fromdos文件

如果您使用的操作系统(如OS X)没有dos2unix命令但有Python解释器(版本2.5+),则此命令等同于source ~/.bashrc命令:

python -c "import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))"

它处理命令行上的命名文件以及管道和重定向,就像<=>一样。如果将此行添加到〜/ .bashrc文件(或其他shell的等效配置文件)中:

alias dos2unix="python -c \"import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))\""

...下次登录(或在当前会话中运行<=>)时,您将能够以与其他示例相同的方式在命令行上使用<=>名称。

对于UNIX ...我注意到dos2unix从我的UTF-8文件中删除了Unicode标头。在git bash(Windows)下,以下脚本似乎运行良好。它使用sed。请注意,它仅删除行末尾的回车符,并保留Unicode标题。

#!/bin/bash

inOutFile="$1"
backupFile="${inOutFile}~"
mv --verbose "$inOutFile" "$backupFile"
sed -e 's/\015$//g' <"$backupFile" >"$inOutFile"

如果您正在运行X环境并拥有适当的编辑器(visual studio代码),那么我会遵循推荐:

Visual Studio代码:如何显示行结尾

只需转到屏幕的右下角,visual studio代码就会显示文件编码和文件后面的行尾约定,只需点击一下即可切换它。

在Linux环境中使用可视代码作为notepad ++的替代品,你就可以了。

我已经使用了python,这里是我的代码;

end1='/home/.../file1.txt'
end2='/home/.../file2.txt'
with open(end1, "rb") as inf:
     with open(end2, "w") as fixed:
        for line in inf:
            line = line.replace("\n", "")
            line = line.replace("\r", "")
            fixed.write(line)

虽然这是一篇较老的帖子,但最近我遇到了同样的问题。因为我在/ tmp / blah_dir /里面重命名了所有文件,因为这个目录中的每个文件都有<!> quot; / r <!> quot;尾随字符(在文件末尾显示<!> quot;?<!>;),所以我只能想到它的脚本方式。

我想保存具有相同名称的最终文件(不跟踪任何字符)。 使用sed,问题是输出文件名,我需要提及别的东西(我不想要)。

我尝试了其他选项(由于某些限制而未考虑dos2unix)但是没有用。

我尝试使用<!>“; awk <!>”;最后哪个工作在我使用<!>“; \ r <!>”的地方作为分隔符并采取第一部分

技巧是:

echo ${filename}|awk -F"\r" '{print $1}'

在我使用的脚本片段下面(我所有的文件都有<!>“\ r <!>”;作为路径/ tmp / blah_dir /的尾随字符)来解决我的问题:

cd /tmp/blah_dir/
for i in `ls`
  do
    mv   $i     $(echo $i | awk -F"\r" '{print $1}')
done

注意:这个例子虽然接近我的工作但不是很精确(这里提到的只是为了更好地了解我的所作所为)

你可以这样做:

$ echo $(cat input) > output
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top