Я хотел бы использовать sed для поиска первой части текстового файла с последовательными строками с не менее чем n
пробелами. Я хотел бы напечатать с первой из этих строк до конца файла.
Каков наилучший способ сформулировать это?
С sed это должно работать:
n=5 sed -ne "/\([^[:blank:]].*\)\{$n\}/!d;h;n;//!d;x;p;x;:1" -e 'p;n;b1'
awk -vn=$n ' !p {line = $0; gsub(/[[:space:]]/, "")} !p && length($0) >= n && prev_is_long {p = 1; print prev} !p {prev = line; prev_is_long = (length($0) >= n)} p {print} ' file1
Я знаю, что вы сказали sed (не каламбур), но если вы можете жить с PERL, следующее должно делать то, что вы хотите (n = 20):
#!/usr/bin/perl -w my $n=20; ## The minimum length of the line my $prev=""; ## This holds the number of chars in the previous line my $pline; ## This holds the previous line my $pp=0; ## Counter, lines will be printed if set to 1 while(<>){ ## Skip line processing if we have already ## found our lines of interest $pp==1 && do {print; next}; ## Get non-space chars my $a=join("",/[^\s]+/g); ## Print if requirements are met. if (length($prev)> $n && length($a)> $n){ print $pline,$_; $pp=1; } $prev=$a; $pline=$_; }
в#!/usr/bin/perl -w my $n=20; ## The minimum length of the line my $prev=""; ## This holds the number of chars in the previous line my $pline; ## This holds the previous line my $pp=0; ## Counter, lines will be printed if set to 1 while(<>){ ## Skip line processing if we have already ## found our lines of interest $pp==1 && do {print; next}; ## Get non-space chars my $a=join("",/[^\s]+/g); ## Print if requirements are met. if (length($prev)> $n && length($a)> $n){ print $pline,$_; $pp=1; } $prev=$a; $pline=$_; }
Сохраните его как foo.pl и запустите так:
$ perl foo.pl infile.txt