我想从文件的开头和结尾删除空行,但不删除中间非空行之间的空行。我认为sed
或awk
将是解决方案。
资源:
1:
2:
3:line1
4:
5:line2
6:
7:
8:
输出:
1:line1
2:
3:line2
我想从文件的开头和结尾删除空行,但不删除中间非空行之间的空行。我认为sed
或awk
将是解决方案。
资源:
1:
2:
3:line1
4:
5:line2
6:
7:
8:
输出:
1:line1
2:
3:line2
尝试这个,
要从文件开头删除空行:
要从文件末尾删除空行:
要从文件的开头和结尾删除空行:
从 man sed,
-e script, --expression=script -> 将脚本添加到要执行的命令中
b 标签 -> 分支到标签;如果省略标签,则跳转到脚本末尾。
a -> 在一行之后附加文本(替代语法)。
$ -> 匹配最后一行。
n N -> 将换行符添加到模式空间,然后将下一行输入附加到模式空间。如果没有更多输入,则 sed 退出,不再处理任何命令。
这个小 awk 程序将删除文件开头的空行:
所以我们可以将它与
tac
反转线结合起来并得到:窃取@guillermo chamorro 的命令替换技巧:
如果文件小到足以满足内存要求:
-0777
啜食整个输入文件^\n+
字符串开头的一个或多个换行符\n\K
防止删除最后一个非空行的换行符\n+$
字符串末尾的一个或多个换行符我提出这个:
它将打印除起始空白行之外的整个文本。因此,如果我们扩展示例:
它将输出:
使用 Raku(以前称为 Perl_6):
如果使用 将文件读入 Raku
lines
,则可以巧妙地使用该trim
函数来清理文件开头和结尾的空白行(即空格):输入文件与@schrodigerscatcuriosity 使用的相同(文件开头有两个空行,文件末尾有两个空行)。如果您只需要清理文件的开头/结尾,那么
trim-leading
您trim-trailing
就是您的朋友。或者,下面是 @Sundeep 的 Perl5 代码的非常简单的翻译,使用了一些 Raku 功能:
对于 Perl5 到 Raku 的翻译:文件被
slurp
-ed in 并且 Raku 的S///
非破坏性替换运算符用于返回结果字符串。交替是通过 Raku 的||
“第一次匹配”交替运算符完成的,因为 Raku 的|
交替运算符表示最长令牌匹配(LTM,一种改进)。Perl5
/k
和/或/K
命令的 Raku 等价物很简单<( ... )>
,可以单独使用或成对使用。这些运算符指示正则表达式引擎删除之前<(
或之后的任何匹配项)>
。[注意,然而,\K
Raku 中的等价物对于手头的问题似乎是不必要的]。https://raku.org
一个简单的两遍方法只是为了完整性:
以上将仅包含空白字符的行视为空行。相反,如果您只想将完全没有字符的行视为空行,则只需更改
NF
为/./
.扩展@schrodigerscatcuriosity 命令替代技巧:
我想shell-magics还有更多的空间。
GNU sed 对行长没有限制。
-z
flag 告诉编辑器读取文本直到 NUL 字符分隔符,并且由于文件中没有这样的分隔符,它将整个文件读取为一行。但出于兼容性原因,建议将模式限制为不超过 4000 字节。还:
Ed和Ex是可以处理此任务的 POSIX 编辑器。
它们非常相似,并且在此处介绍的解决方案
ed
中ex
可以 100% 互换1。一般解决方案
如果已知文件的开头和结尾有空行
如果您实际上是指空白2行
解释和分解
手册总是最好的解释,但这里有一个概述:
Ed 和 Ex 总是从选择的最后一行开始——所以如果我们发出一个简单的
d
(删除命令),它会删除最后一行——它们可以查找匹配正则表达式的行。一些命令采用地址(“行号”),例如
3,6d
从第 3 行到第 6 行删除。/regex/
期待匹配“正则表达式”的第一行。?regex?
在后面寻找匹配“regex”的第一行。你猜怎么着?正则表达式也可以是地址。
为什么我们需要临时添加两个空行作为通用解决方案?因为否则
1,/./-1d
总是会删除第一行和?.?+1,$d
最后一行,即使不是空的。1:但是 IIRC 一个干净的 Debian 安装缺少 Ed,所以我选择 Ex。
2:即,视觉上是空的但可能包含空格和制表符的行。
命令
输出