当前位置:  开发笔记 > 编程语言 > 正文

如何仅更改文件的第一行?

如何解决《如何仅更改文件的第一行?》经验,为你挑选了3个好方法。

我想知道我可以在sed中使用哪种模式来更改巨大文件的第一行(~2 GB).对sed的偏好只是因为我认为它必须比Python或Perl脚本更快.

这些文件具有以下结构:

field 1, field 2, ... field n
data

并且,考虑到每个字段的标识符中都有空格的可能性,我需要用这种方式用下划线替换每个空格:

**BEFORE** 
the first name,the second name,the first surname,a nickname, ...
data

**AFTER**
the_first_name,the_second_name,the_first_surname,a_nickname, ...
data

任何指向正确模式的指针,或其他脚本解决方案都会很棒.



1> Leon Timmerm..:

编辑前10行

sed -i -e '1,10s/ /_/g'

在Perl中,您可以在标量上下文中使用触发器运算符:

perl -i -pe 's/ /_/g if 1 .. 10'



2> Renaud Bompu..:

我认为您不想使用任何需要将数据写入新文件的解决方案.

如果您非常确定所需要的是在大文本文件的第一行中将空格更改为下划线,则只需读取第一行,交换字符并将其写回原位:

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

my $filename = shift;
open (FH, "+< $filename") || die "can't open $filename: $!";
my $line = ;
$line =~ s/ /_/g;
seek FH, 0, 0; # go back to the start of the file
printf FH $line;
close FH;

要使用它,只需传递文件的完整路径即可更新:

# fixheader "/path/to/myfile.txt"



3> jrockway..:

您不太可能注意到Perl,Python和sed之间存在任何速度差异.您的脚本将花费大部分时间等待IO.

如果行长度相同,则可以就地编辑,否则必须创建新文件.

在Perl中:

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

my $filename = shift;
open my $in_fh, '<', $filename
  or die "Cannot open $filename for reading: $!";
my $first_line = <$in_fh>;

open my $out_fh, '>', "$filename.tmp"
  or die "Cannot open $filename.tmp for writing: $!";

$first_line =~ s/some translation/goes here/;

print {$out_fh} $first_line;
print {$out_fh} $_ while <$in_fh>; # sysread/syswrite is probably better

close $in_fh;
close $out_fh;

# overwrite original with modified copy
rename "$filename.tmp", $filename
  or warn "Failed to move $filename.tmp to $filename: $!";

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有