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