如何删除文件开头和结尾的空行?

如何删除文件开头和结尾的空行?

我想从文件的开头和结尾删除空行,但不删除中间非空行之间的空行。我认为sed或者awk将是解决方案。

来源:

1:
2:
3:line1
4:
5:line2
6:
7:
8:

输出:

1:line1
2:
3:line2

答案1

尝试这个,

要从文件开头删除空行:

sed -i '/./,$!d' filename

要从文件末尾删除空行:

sed -i -e :a -e '/^\n*$/{$d;N;ba' -e '}' file

要删除文件开头和结尾的空行:

sed -i -e '/./,$!d' -e :a -e '/^\n*$/{$d;N;ba' -e '}' file

来自男人sed,

-e script, --expression=script -> 将脚本添加到要执行的命令中

b 标签 -> 分支到标签;如果省略标签,则分支到脚本末尾。

a -> 在行后附加文本(替代语法)。

$ -> 匹配最后一行。

n N -> 将换行符添加到模式空间,然后将下一行输入附加到模式空间。如果没有更多输入,则 sed 退出而不处理任何其他命令。

答案2

这个 awk 小程序将删除开始文件的:

awk 'NF {p=1} p'

所以我们可以将其与tac反转线结合起来并得到:

awk 'NF {p=1} p' file | tac | awk 'NF {p=1} p' | tac
line1

line2

偷窃@吉列尔莫查莫罗的命令替换技巧:

awk 'NF {p=1} p' <<< "$(< file)"

答案3

如果文件足够小以满足内存要求:

$ perl -0777 -pe 's/^\n+|\n\K\n+$//g' ip.txt
line1

line2
  • -0777读取整个输入文件
  • ^\n+从字符串开头算起一个或多个换行符
  • \n\K防止删除最后一个非空行的换行符
  • \n+$字符串末尾有一个或多个换行符

答案4

使用 Raku(以前称为 Perl_6):

如果使用 Raku 将文件读入lines,那么巧妙地使用该 trim函数可以清除文件开头和结尾的空白行(即空白):

$ raku -e 'lines.join("\n").trim.put;' start_end.txt
lineX
line1

line2
line1

line2
line1

line2
line1



line2
~$

输入文件与 @schrodigerscatcuriosity 使用的文件相同(文件开头有两个空行,文件末尾有两个空行)。如果您只需要清理文件的开头/结尾,那么trim-leadingtrim-trailing就是您的朋友。

或者,下面是 @Sundeep 的 Perl5 代码的相当简单的翻译,使用了一些 Raku 功能:

raku -e 'S:g/ ^\n+ || \n+$ //.put given slurp;' start_end.txt

对于 Perl5 到 Raku 的翻译:文件被-ed 并使用slurpRaku 的非破坏性替换运算符S///返回结果字符串。交替是通过 Raku 的||“第一匹配”交替运算符来完成的,因为 Raku 的|交替运算符表示最长令牌匹配(LTM,一种改进)。

/kPerl5 的和/或/K命令的 Raku 等效项很简单<( ... )>,单独使用或成对使用。这些运算符指示正则表达式引擎删除 之前<(或之后的任何匹配项)>。 [但请注意,\KRaku 中的等效项对于当前的问题似乎是不必要的]。

https://raku.org

相关内容