如果文件为空,则删除前两行文件的Sed脚本

时间:2012-02-29 10:03:28

标签: perl sed pattern-matching

我正在尝试编写一个相当简洁的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上运行!遗憾!

7 个答案:

答案 0 :(得分:8)

以下是在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 ||=表示一旦开始打印,它就不会停止。

答案 1 :(得分:3)

不是perl和尚,但我会在Perl中做到这一点(可能还有更好的方法):

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

答案 2 :(得分:2)

可以在这样的简单awk脚本中完成:

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

编辑:由于awk不被认为是解决问题的公认工具,因此这是一个可在Mac和Linux上运行的sed命令:

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

OR

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

假设文件没有~@#%-=行(可以更改为任何其他任意文本)。

答案 3 :(得分:2)

我认为这应该适用于sed(如果你想删除两个第一行,如果两者都是空的话):

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

即:1,1 =转到第一行,N =追加模式空间的下一行,^\n$/d =如果它们为空则删除这两行。

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

sed '1,2/^$/d'

答案 4 :(得分:2)

这可能对您有用:

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

答案 5 :(得分: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

答案 6 :(得分:-3)

你可以用awk这样做

cat 1.txt | awk '{if(NR>2){print $0;}}'
相关问题