sed设计用于处理文本文件而不是二进制文件,尽管这些日子的区别通常不如以前那么重要.最大的问题是文本文件不包含零字节(值为0的字节)和二进制文件,并且许多C字符串处理函数在第一个零字节处停止. sed还会读取由换行符标记的"行".因此,二进制文件最终可能会出现长行.最后,无法保证字符串开始和结束标记相对于换行符的相对位置.sed与Perl相比,所有这些特性都不适合这项工作.
在Perl中,我非常想将文件粘贴到内存中,使用适当的正则表达式从内存映像中删除数据,然后将结果写回适当的位置.
perl -e 'local($/); $data = <>; $data =~ s/stringstart(.*?)stringend//gms; print $data'
Run Code Online (Sandbox Code Playgroud)
现在测试 - 测试数据使用:
#!/usr/bin/env perl
use strict;
use warnings;
sub full_set
{
foreach my $i (0..255) { printf "%c", $i; }
}
sub random_set
{
my($n) = @_;
foreach my $i (0..$n) { printf "%c", int(rand(255)); }
}
full_set;
random_set(1024);
printf("stringstart");
full_set;
random_set(512);
full_set;
printf("stringend");
random_set(256);
Run Code Online (Sandbox Code Playgroud)
该脚本从输入中删除1045个字符 - 对应于'stringstart','stringend'(20)+ 2*256 + 513(因为random_set(512)打印513个字符).
请注意,主脚本会立即将所有文件读入内存.如果你希望它一次处理一个文件,你将不得不更努力地工作; 它可能不再是一个单行.
| 归档时间: |
|
| 查看次数: |
1702 次 |
| 最近记录: |