在Unix中删除回车


Answers:


261

我会假设你的意思回车(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

如果您的包装盒中未安装任何这些工具,那么与尝试转换文件相比,您遇到的问题更大:-)


13
\r仅适用于GNU sed,否则您可以执行以下操作:sed `echo "s/\r//"`
lapo

15
MacO sed既不echo承认也不认可\r。在这种情况下,只能printf "\r"正常工作。
史蒂夫·鲍威尔

30
要详细说明sed "s/$(printf '\r')\$//"
@steve

7
要解决Mac上的问题,您还可以在单​​引号sed字符串$sed $'s@\r@@g' |od -c\n
前面添加

1
我不确定100%,但对于OS X,使用CTRL-V + CTRL-M代替\r它可能会起作用。

240
tr -d '\r' < infile > outfile

参见tr(1)


4
不太好:1.不能就地工作,2.不能在EOL上代替\ r(这可能是或可能不是您想要的...)。
Tomasz Gandor 2014年

10
1.大多数unixy工具都是以这种方式工作的,通常这是最安全的处理方式,因为如果您搞砸了,您仍然会拥有原始工具。2.所述问题是删除回车,而不是转换行尾。但是还有许多其他答案可能会更好地为您服务。
Henrik Gustafsson 2014年

1
如果您tr不支持\r转义符,请尝试输入'\015'一个文字'^M'(在许多终端上的许多shell中,ctrl-V ctrl-M会产生文字ctrl-M字符)。
2014年

那么,如何在需要时改变它outfile = infile呢?
Christopher

3
@donlan,回应较晚,但您通常使用:someProg <in >out && mv out in
paxdiablo

38

老套:

tr -d '\r' < filewithcarriagereturns > filewithoutcarriagereturns

32

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

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

强引号周围的替换操作's/\r//'必不可少的。没有它们,shell将被解释\r为一个scape + r,并将其简化为普通形式r,并删除所有小写字母r。这就是为什么Rob在2009年给出的答案不起作用的原因。

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



7

sed -i s/\r// <filename>或类似的东西;查看man sed或在网络上获得有关使用的大量信息sed

需要指出的一件事是上述“回车”的确切含义;如果您真正的意思是单个控制字符“回车”,那么上面的模式是正确的。如果更一般地说,如果您是指CRLF(回车和换行,这是Windows下实现换行的方式),那么您可能想要替换\r\n。Linux / Unix中的裸换行符(newline)为\n


我正在尝试使用-> sed's / \ r \ n / = /'countryNew.txt> demo.txt无法正常工作。“老虎”“狮子”。
Suvasis

我们是否可以认为您使用Mac?我注意到达尔文sed默认情况下与大多数Linux版本相比具有不同的命令和功能集……
jsh 2014年

4
仅供参考,s/\r//似乎没有删除OS X上的回车符,而是删除了文字r字符。我不确定为什么会这样。也许与字符串的引用方式有关?作为解决方法,使用CTRL-V + CTRL-M代替\r似乎有效。

6

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

:%s/\r//g

或搭配

:1,$ s/^M//

请注意,您应该先按ctrl-v然后按ctrl-m来输入^ M。


2
不好:如果文件的每一行都带有CR(即是正确的DOS文件),vim将使用filetype = dos加载它,而根本不显示^M-s。解决这个问题需要大量的按键操作,这不是vim的目的。我只想使用sed -i,然后使用-e's / \ r $ // g'将删除限制为EOL的CR。
Tomasz Gandor 2014年

6

再一次解决……因为总有一个:

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

很好,因为它已经安装到位并且可以在我使用过的各种unix / linux中使用。


3

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

如果已安装,请跳至下一步。如果尚未安装,建议您通过以下方式安装yum

yum install dos2unix

然后您可以像这样使用它:

dos2unix fileIWantToRemoveWindowsReturnsFrom.txt

2

如果您使用的操作系统(如OS X)没有该dos2unix命令,但具有Python解释器(版本2.5+),则此命令等效于以下dos2unix命令:

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

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

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

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



1

试试这个将DOS文件转换成Unix文件:

fromdos文件


1

对于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"

1

如果您正在运行X环境并且具有适当的编辑器(Visual Studio代码),那么我将遵循以下建议:

Visual Studio代码:如何显示行尾

只需转到屏幕的右下角,Visual Studio代码就会向您显示文件编码和行尾约定,再显示文件,只需单击一下即可切换显示。

只需在Linux环境中使用可视代码替代notepad ++,您就可以开始使用了。


或在将文件复制到Linux系统之前Notepad++Edit / EOL Conversion / Unix (LF)在Windows系统上使用的命令。
杰西·奇斯霍尔姆

1

\r在任何UNIX®系统上删除:

这个问题中大多数现有的解决方案都是特定于GNU的,并且不能在OS X或BSD上运行;下面的解决方案应该可以在更多的UNIX系统上使用,并且在任何shell中都可以使用从tcshsh,甚至在GNU / Linux上也可以使用。

在OS X,OpenBSD和NetBSD上tcsh以及在Debian GNU / Linux上进行了测试bash


sed

tcshOS X上,以下sed代码段可与一起使用printf,因为既不像GNU那样sed也不以特殊方式echo处理\r

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

tr

另一种选择是tr

tr -d '\r' < input > output

sed和之间的区别tr

似乎tr保留了输入文件中缺少尾随换行符的功能,而sed在OS X和NetBSD上(但在OpenBSD或GNU / Linux上则没有),即使输入缺少任何尾随的换行符也将在文件的末尾插入尾随的换行符。在文件的末尾\r\n末尾。


测试:

下面是可用于确保您的系统上这个作品,使用一些样品测试printfhexdump -C; 或者,od -c如果您的系统丢失,也可以使用hexdump

% printf 'a\r\nb\r\nc' | hexdump -C
00000000  61 0d 0a 62 0d 0a 63                              |a..b..c|
00000007
% printf 'a\r\nb\r\nc' | ( sed `printf 's/\r$//g'` /dev/stdin > /dev/stdout ) | hexdump -C
00000000  61 0a 62 0a 63 0a                                 |a.b.c.|
00000006
% printf 'a\r\nb\r\nc' | ( tr -d '\r' < /dev/stdin > /dev/stdout ) | hexdump -C
00000000  61 0a 62 0a 63                                    |a.b.c|
00000005
% 

0

我已经用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)

0

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

我想用相同的名称保存最终文件(不尾随任何字符)。使用sed时,问题是输出文件名,我需要提到其他东西(我不想要)。

我尝试了这里建议的其他选项(由于某些限制,不考虑使用dos2unix),但是没有用。

我最终尝试使用“ awk”,在使用“ \ r”作为分隔符的地方起作用,并采用了第一部分

诀窍是:

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

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

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

注意:尽管与我的工作很接近,但这个示例并不十分准确(此处提及只是为了更好地了解我的工作)


0

我做了这个shell脚本来删除\ r字符。它适用于solaris和red-hat:

#!/bin/ksh

LOCALPATH=/Any_PATH

for File in `ls ${LOCALPATH}`
do
   ARCACT=${LOCALPATH}/${File}
   od -bc ${ARCACT}|sed -n 'p;n'|sed 's/015/012/g'|awk '{$1=""; print $0}'|sed 's/ /\\/g'|awk '{printf $0;}'>${ARCACT}.TMP
   printf "`cat ${ARCACT}.TMP`"|sed '/^$/d'>${ARCACT}
   rm ${ARCACT}.TMP
done

exit 0

-1

您可以简单地做到这一点:

$ echo $(cat input) > output

不知道为什么有人给“ -1”。这是一个很好的答案(也是唯一对我有用的答案)。
FractalSpace 2015年

1
哦,对不起,是我。等等,看,它真的对'\ r'不起作用!
Viacheslav Rodionov,2015年

1
@FractalSpace这是一个糟糕的主意!它完全破坏了文件中的所有间距,并使文件的所有内容都由外壳程序解释。尝试使用包含一行的文件a * b...
Tom Fenech
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.