我想使用 sed 搜索文本文件的第一部分,其中连续行至少包含n
非空格字符。我想从这些行的第一行打印到文件的末尾。
表述这个问题的最佳方法是什么?
答案1
使用 sed,这应该可以工作:
n=5
sed -ne "/\([^[:blank:]].*\)\{$n\}/!d;h;n;//!d;x;p;x;:1" -e 'p;n;b1'
答案2
awk -v n=$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
答案3
我知道你说的是 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=$_;
}
将其保存为 foo.pl 并像这样运行:
$ perl foo.pl infile.txt