我想从文件的开头和结尾删除空行,但不删除中间非空行之间的空行。我认为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-leading
和trim-trailing
就是您的朋友。
或者,下面是 @Sundeep 的 Perl5 代码的相当简单的翻译,使用了一些 Raku 功能:
raku -e 'S:g/ ^\n+ || \n+$ //.put given slurp;' start_end.txt
对于 Perl5 到 Raku 的翻译:文件被-ed 并使用slurp
Raku 的非破坏性替换运算符S///
返回结果字符串。交替是通过 Raku 的||
“第一匹配”交替运算符来完成的,因为 Raku 的|
交替运算符表示最长令牌匹配(LTM,一种改进)。
/k
Perl5 的和/或/K
命令的 Raku 等效项很简单<( ... )>
,单独使用或成对使用。这些运算符指示正则表达式引擎删除 之前<(
或之后的任何匹配项)>
。 [但请注意,\K
Raku 中的等效项对于当前的问题似乎是不必要的]。