Sed 脚本删除文件的前两行(如果它们为空)

问题描述 投票:0回答:8

我正在尝试编写一个相当简洁的 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 sed pattern-matching
8个回答
9
投票
这是在 Perl 中执行此操作的一种方法:

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 ||=

表示一旦开始打印就不会停止。


3
投票
不是 Perl 僧侣,但我会在 Perl 中执行此操作(可能有更好的方法):

$_ = <> or exit 0; print unless /^\s*$/; $_ = <> or exit 0; print unless /^\s*$/; print while <>;
    

2
投票
我认为这应该与 sed 一起使用(如果你想删除第一行,如果两者都是空的话):

sed '1,1{N;/^\n$/d}'

即:

1,1

 = 转到第一行,
N
 = 将下一行追加到模式空间,
^\n$/d
 = 删除这两行(如果它们为空)。

如果您想删除前两行,如果它们是空的(独立于另一行),您可以这样做:

sed '1,2/^$/d'
    

2
投票
可以通过像这样的简单 awk 脚本来完成:

awk 'NR>2 || $0 != ""' file.txt

编辑: 由于 awk 不被认为是解决问题的公认工具,因此这里有一个适用于 Mac 和 Linux 的 sed 命令:

sed '/^$/{1,2d;}' file.txt

sed '1,2s/^$/~@#%-=/; /^~@#%-=$/d' file.txt

假设文件没有

~@#%-=

 行(可以更改为任何其他任意文本)。


2
投票
这可能对你有用:

sed -e '1{/^$/d}' -e '2{/^$/d}' file
    

0
投票
您可以使用

ed

文本编辑器:

$ echo -e '1,2g/^$/d\n%p' | ed -s input.txt

如果要保存结果:(将

%p

更改为w

$ echo -e '1,2g/^$/d\nw' | ed -s input.txt
    

0
投票
这是在 Perl 中执行此操作的一种简单方法。 仅当前两行均为空时,它才会跳过它们。 如果只有一行为空,则会打印两行。 如果要将空格算作空行,请将正则表达式从

/^\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
    

-3
投票
你可以用awk这样做

cat 1.txt | awk '{if(NR>2){print $0;}}'
    
© www.soinside.com 2019 - 2024. All rights reserved.