我一直在收到一个文本文件,其中每行的长度应为246列。由于某种原因,每23,036个字符后,文件中插入了错误的CRLF,从而导致各种问题。
该文件采用Windows格式,所有行结尾均为CRLF。
有没有办法从这个文件中删除这些额外的CR-LF字符,而不会干扰每一行结尾处存在的CRLF?如果可能的话,Unix工具将是这里的首选方法(awk,sed等)。
下面是添加额外CRLF字符时文本块的样子示例。请注意,此文件的大小为258 Meg,并且在文件的下方不同位置沿着该行发生额外的CRLF。
答案 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完整无缺。然后转到下一条记录。