从文件中间删除CRLF

时间:2016-09-23 16:19:11

标签: unix awk sed carriage-return linefeed

我一直在收到一个文本文件,其中每行的长度应为246列。由于某种原因,每23,036个字符后,文件中插入了错误的CRLF,从而导致各种问题。

该文件采用Windows格式,所有行结尾均为CRLF。

有没有办法从这个文件中删除这些额外的CR-LF字符,而不会干扰每一行结尾处存在的CRLF?如果可能的话,Unix工具将是这里的首选方法(awk,sed等)。

下面是添加额外CRLF字符时文本块的样子示例。请注意,此文件的大小为258 Meg,并且在文件的下方不同位置沿着该行发生额外的CRLF。

enter image description here

3 个答案:

答案 0 :(得分:1)

当你不确定什么位置时,你可以删除所有行结尾并将它们添加到正确的位置:

(tr -d "\r\n" < my_inputfile | fold -w 245;echo) | sed 's/$/\r/'

需要echo,因为fold不会为最后一行添加换行符。

答案 1 :(得分:0)

这是一个运行循环的简单perl脚本,在每次迭代中,它将23036个字节复制到输出,然后跳过后面的CRLF。

#!/usr/bin/perl
use strict;
use warnings;

while (1) {
    my $r=read STDIN,my $buf,23036;
    defined $r or die "error: $!";
    last if $r<23036;
    print $buf;
    my $c=read STDIN,my $crlf,2;
    defined $c or die "error: $!";
    $crlf eq "\r\n" or die "Not a CRLF";
}

你这样运行:

./myscript.pl < input-file.txt > output-file.txt

答案 2 :(得分:0)

使用awk

$s=0;
eval('$s = "my name is";');
echo $s;

请注意,“unix”文本文件的行结尾为awk ' length($0) != 247 {sub(/\r$/,""); printf "%s", $0; next} {print} ' file ,因此\n只是一个普通字符。这就是为什么我使用246 + 1作为记录长度,并从记录片段中删除CR。

更新:是的,上面的答案是不正确的:它不会正确追加下一行,而是接下来的两行。试试这个:

\r

检测到短线时,请删除CR并打印,不要换行。然后阅读下一行,我假设是该记录的其余部分,并打印出CR完整无缺。然后转到下一条记录。