在Unix中删除回车

问题描述 投票:195回答:17

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

unix carriage-return
17个回答
244
投票

我假设你的意思是在行的末尾有回车(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是你的系统上安装的方法:

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

如果由于某种原因dos2unix不适合你,那么sed会这样做:

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

如果由于某种原因sed不适合你,那么ed会以复杂的方式做到这一点:

$ 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

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


2
投票

这是事情,

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

yum install dos2unix


1
投票

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

fromdos文件


1
投票

如果您使用的操作系统(如OS X)没有dos2unix fileIWantToRemoveWindowsReturnsFrom.txt 命令但具有Python解释器(版本2.5+),则此命令等同于%0d命令:

dos2unix fileName.extension fileName.extension

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

dos2unix

...下次登录时(或在当前会话中运行python -c "import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))" ),您将能够以与其他示例相同的方式在命令行上使用dos2unix名称。


1
投票

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

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

1
投票

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

source ~/.bashrc

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

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


0
投票

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

dos2unix

0
投票

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

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

我尝试了这里建议的其他选项(因为一些限制而不考虑dos2unix)但是没有用。

我最后尝试了“awk”,其中我使用“\ r”作为分隔符,并采取了第一部分:

诀窍是:

#!/bin/bash

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

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

Visual Studio Code: How to show line endings

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


0
投票

Removing 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) on any UNIX® system:

此问题中的大多数现有解决方案都是特定于GNU的,并且不适用于OS X或BSD;下面的解决方案应该适用于更多的UNIX系统,以及任何shell,从echo ${filename}|awk -F"\r" '{print $1}' cd /tmp/blah_dir/ for i in `ls` do mv $i $(echo $i | awk -F"\r" '{print $1}') done ,但是在GNU / Linux上也是如此。

\r上的OS X,OpenBSD和NetBSD以及tcsh上的Debian GNU / Linux上进行了测试。


使用sh

在OS X上的tcsh中,以下bash片段可以与sed一起使用,因为tcshsed都不像GNU那样以特殊方式处理printf

sed

使用echo

另一种选择是\r

sed `printf 's/\r$//g'` input > output

trtr之间的区别:

似乎tr -d '\r' < input > output 保留输入文件中缺少尾随换行符,而OS X和NetBSD上的sed(但不是OpenBSD或GNU / Linux)在文件的最末端插入一个尾随换行符,即使输入是在文件的最后遗漏任何尾随的trtr


测试:

这里有一些样本测试,可用于确保在您的系统上使用sed\r;或者,如果您的系统缺少\n,也可以使用printf

hexdump -C

-1
投票

你可以这样做:

od -c

216
投票
tr -d '\r' < infile > outfile

tr(1)


36
投票

老套:

tr -d '\r' < filewithcarriagereturns > filewithoutcarriagereturns

27
投票

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


25
投票

在我看来,Linux上最简单的方法是:

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

替代运营商's/\r//'周围的强势报价至关重要。如果没有它们,shell会将\r解释为escape + r并将其缩小为普通的r,并移除所有小写r。这就是为什么Rob在2009年给出的答案不起作用的原因。

并添加/g修饰符确保即使多个\r将被删除,而不仅仅是第一个。


7
投票

qazxsw poi或其他一些;请参阅qazxsw poi或网上有关使用sed -i s/\r// <filename>的大量信息。

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


6
投票

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

\r\n

或者

\n

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


6
投票

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

:%s/\r//g

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


3
投票

别人推荐:1,$ s/^M// ,我也强烈推荐它。我只是提供更多细节。

如果已安装,请跳至下一步。如果尚未安装,我建议通过perl -i -pe 's/\r//' filename 安装它,如:

dos2unix

然后你就可以使用它:

yum
© www.soinside.com 2019 - 2024. All rights reserved.