在Unix中删除回车

时间:2009-04-28 22:05:57

标签: unix carriage-return

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

21 个答案:

答案 0 :(得分:240)

我假设你的意思是在行的结束处的回车( 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

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

答案 1 :(得分:213)

tr -d '\r' < infile > outfile

请参阅tr(1)

答案 2 :(得分:36)

旧学校:

tr -d '\r' < filewithcarriagereturns > filewithoutcarriagereturns

答案 3 :(得分:27)

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

答案 4 :(得分:21)

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

var array=[
        {Key:"Name",Value:"Sam" },
        {Key:"Marks",Value:"50"},
        {Key:"Subject",Value:"English"},
    ];
var i=0;
var value;
for(array as value) {
    value[i]=$(this).text();
    i++;
    alert(value[i]);
}

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

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

答案 5 :(得分:7)

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

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

答案 6 :(得分:6)

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

:%s/\r//g

:1,$ s/^M//

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

答案 7 :(得分:6)

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

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

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

答案 8 :(得分:3)

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

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

yum install dos2unix

然后你就可以使用它:

dos2unix fileIWantToRemoveWindowsReturnsFrom.txt

答案 9 :(得分:2)

这就是事情,

dos2unix fileName.extension fileName.extension是回车符。使其与Unix兼容。我们需要使用以下命令。

A

答案 10 :(得分:1)

如果您使用的操作系统(如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名称实例

答案 11 :(得分:1)

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

  

fromdos文件

答案 12 :(得分: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"

答案 13 :(得分:1)

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

Visual Studio Code: How to show line endings

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

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

答案 14 :(得分:0)

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

var has_clicked = false;
$(document).ready(function(){
    $(".navbar-toggle").click(function() {
        if(!has_clicked){
            setTimeout(function () {
                has_clicked = true;
                $(".navbar-toggle").click();
            }, 4500);
        }
    });
}); 

答案 15 :(得分: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

注意:这个示例虽然与我的工作非常接近,但并不十分精确(此处提及的目的只是为了更好地说明我的工作)

答案 16 :(得分:0)

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

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

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


使用sed

在OS X的tcsh中,以下sed代码段可以与printf一起使用,因为sedecho都不能处理{{1 }}就像GNU一样:

\r

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

另一个选项是tr

tr

tr -d '\r' < input > output sed之间的区别:

看来tr保留了输入文件中没有尾随换行符,而tr在OS X和NetBSD(而不是在OpenBSD或GNU / Linux上)上插入了尾随换行符即使输入在文件的末尾缺少任何结尾的sed\r,文件的末尾也是如此。


测试:

这里有一些示例测试,可以使用\nhexdump -C来确保它在您的系统上有效;或者,如果您的系统缺少printf,也可以使用od -c

hexdump

答案 17 :(得分: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

答案 18 :(得分:0)

cat input.csv | sed's / \ r / \ n / g'> output.csv

为我工作

答案 19 :(得分:0)

使用sed

sed $'s/\r//' infile > outfile

在Windows的Git Bash上使用sed

sed '' infile > outfile

第一个版本使用 ANSI-C引号,如果命令从脚本运行,则可能需要转义\。第二个版本利用sed通过删除\r\n字符逐行读取输入文件这一事实。但是,将行写入输出文件时,它仅附加一个\n字符。只需修改IFS

,即可设计出更通用的跨平台解决方案
IFS=$'\r\n' # or IFS+=$'\r' if the lines do not contain whitespace
printf "%s\n" $(cat infile) > outfile
IFS=$' \t\n' # not necessary if IFS+=$'\r' is used

警告::此解决方案执行文件名扩展(*?[...]以及设置extglob时的更多扩展名)。仅在确定文件不包含特殊字符或要扩展时使用它。
警告:所有解决方案都无法处理输入文件中的\

答案 20 :(得分:-1)

你可以这样做:

$ echo $(cat input) > output