Bash 删除不必要的空行
让我们假设以下代码示例是有效的:Bash 删除不必要的空行,bash,shell,Bash,Shell,让我们假设以下代码示例是有效的: begin statement1; begin statement2; statement3; statement4; statement5; end; statement6; end; 我想删除此代码示例中所有不必要的空行: begin statement1; begin statement2; statement3;
begin
statement1;
begin
statement2;
statement3;
statement4;
statement5;
end;
statement6;
end;
我想删除此代码示例中所有不必要的空行:
begin
statement1;
begin
statement2;
statement3;
statement4;
statement5;
end;
statement6;
end;
因此,基本上,如果一行以关键字begin
结尾,那么在包含语句的下一行之前的所有空行都应该删除,如果一行以关键字end结尾
然后删除所有空行,直到包含语句的前一行
我使用升华文本创建了两个正则表达式:
begin(\n)*
并替换:begin\n
(\n)*([[:空格:])*end代码>和替换:\n代码>
sed
(就地)一起使用end之前的所有现有空格代码>。这个问题怎么解决
这不是最优雅的解决方案,但我将继续尝试此解决方案:) 我运行的是相同的
awk
,但是我反转了结尾的文件代码>零件(tac
)
对awk的解释:
如果该行不是空的(length
),则打印该行并将b
设置为0
(false)
如果行以字符串begin
(忽略空白字符[\s
])开头,则将b
设置为1
(true)
如果该行为空(^$
),且b
为真(我们在开始
后有一行),则跳过该行(下一行
)
如果该行是空白的,并且我们没有在开始之后
,请打印(因为我们不想消除所有空白行)
使用GNU sed 4.2,您可以选择-z
:
sed -rz 's/begin\n+/begin\n/g;s/\n+([^\n]*end;)/\n\1/g' file
使用较旧的sed
(当原始文件没有\r
时)
tr'\n'\r'
sed
一次操作一行,您不能使用regexp跨多行进行匹配。awk
可能是一个更好的工具。@Barmar您能解释一下为什么使用sed的答案是有效的吗?他把整个文件变成一个长行来欺骗它。谢谢您的回答。目前只有<代码>结束代码>由正则表达式识别。我还需要改变什么,例如end Hello代码>或end Hello\u Foo\u Bar
处理是否正确?为什么end Hello代码>现在不工作?因为sed
查找end代码>,在结束
和之间没有任何内容代码>。您可以使用end[^;\n]代码>(GNU 4.2)或结束[^;\r]代码>。请注意,[^\n]*end
也与friend
匹配,因此您可能需要类似于[^\n\s]*end
的内容。
sed -rz 's/begin\n+/begin\n/g;s/\n+([^\n]*end;)/\n\1/g' file
tr '\n' '\r' < file | sed -r 's/begin\r+/begin\r/g;s/\r+([^\r]*end;)/\r\1/g' | tr '\r' '\n'