我正在尝试编写一个相当简洁的 sed 脚本来删除文件的前两行仅当它们为空时,所以以下文件:
> cat myfile.in
Line 3
Line 5
将产生一个三行输出文件:
> cat myfile.out
Line 3
Line 5
这涉及到组合行范围和模式匹配,我似乎找不到任何例子。如果有人能提出同样(或更多)的 Perl 替代方案,我也很感兴趣。非常感谢。
脚注
我应该补充一点,我尝试过1,2{/^$/d}
,它在 Linux 上运行得非常好,但在 AIX 下我得到了:
sed: 0602-404 Function 1,2{/^$/d} cannot be parsed.
在 Solaris 上我得到:
sed: command garbled: 1,2{/^$/d}
这是一个打击,因为这段代码必须在 AIX 和 Solaris 上运行,但不能在 Linux 上运行!耻辱!
perl -ne 'print if $. > 2 or $_ ne "\n"' <myfile.in >myfile.out
如果您想在空行上允许额外的空格:
perl -ne 'print if $. > 2 or /\S/' <myfile.in >myfile.out
下一个版本做了一些不同的事情。 它仅删除最初的空白行(最多 2 个)。 如果第一行不是空白,但第二行是空白,则两行都会被打印。 (在你回复我的评论之前我就想到了这一点,我喜欢它,下一个遇到这个问题的人可能会有不同的要求。)
perl -ne 'print if $started ||= $. > 2 || /\S/'
$started ||=
表示一旦开始打印就不会停止。
$_ = <> or exit 0; print unless /^\s*$/;
$_ = <> or exit 0; print unless /^\s*$/;
print while <>;
sed '1,1{N;/^\n$/d}'
即:
1,1
= 转到第一行,
N
= 将下一行追加到模式空间,
^\n$/d
= 删除这两行(如果它们为空)。如果您想删除前两行,如果它们是空的(独立于另一行),您可以这样做:
sed '1,2/^$/d'
awk 'NR>2 || $0 != ""' file.txt
编辑: 由于 awk 不被认为是解决问题的公认工具,因此这里有一个适用于 Mac 和 Linux 的 sed 命令:
sed '/^$/{1,2d;}' file.txt
或
sed '1,2s/^$/~@#%-=/; /^~@#%-=$/d' file.txt
假设文件没有
~@#%-=
行(可以更改为任何其他任意文本)。
sed -e '1{/^$/d}' -e '2{/^$/d}' file
ed
$ echo -e '1,2g/^$/d\n%p' | ed -s input.txt
如果要保存结果:(将
%p
w
)
$ echo -e '1,2g/^$/d\nw' | ed -s input.txt
/^\n$/
更改为
/^ *\n$/
,空格现在将被视为空行。 在下面的代码中,带有空格的行不算作空行。 只有带有
\n
的行才被视为空白行。
#!/usr/bin/perl -w
my $line1 = <>;
my $line2 = <>;
#if one of the lines is not empty, print them both
if($line1 !~ /^\n$/ || $line2 !~ /^\n$/){print $line1 . $line2;}
while(<>){
print;
}
输出看起来像这样
$ perl remove.first.two.lines.if.blank.pl remove.first.two.lines.if.blank.txt
Line 3
Line 5
我可以通过将前三行放在开始块中来打高尔夫球,然后用 perl -p 处理其余部分。 打了 57 个字符的高尔夫球。
perl -pe 'BEGIN{$s=<>;$t=<>;if($s!~/^\n$/||$t!~/^\n$/){print $s.$t}}' remove.first.two.lines.if.blank.txt
cat 1.txt | awk '{if(NR>2){print $0;}}'