让我们想象以下代码示例有效:
begin
statement1;
begin
statement2;
statement3;
statement4;
statement5;
end;
statement6;
end;
我想在此代码示例中删除所有不必要的空白行:
begin
statement1;
begin
statement2;
statement3;
statement4;
statement5;
end;
statement6;
end;
因此,基本上,如果一行以关键字begin
结尾,则所有空行,直到下一条包含语句的行都应删除;如果一行以关键字end;
结尾,则所有空行直到上一条包含语句的行应删除。
使用Sublime Text创建了两个正则表达式:
begin(\n)*
并替换:begin\n
(\n)*([[:space:]])*end;
并替换:\nend;
我的问题:
sed
(就地使用)一起使用?end;
之前删除所有现有的空格。如何解决此问题?答案 0 :(得分:2)
使用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' < file | sed -r 's/begin\r+/begin\r/g;s/\r+([^\r]*end;)/\r\1/g' | tr '\r' '\n'
答案 1 :(得分:1)
这不是最优雅的解决方案,但我将继续尝试这一方法:)
cat file | awk '
length { print; b=0 }
/begin/ { b=1 }
/^$/ && b { next }
!length && !b { print }
' | tac | awk '
length { print; b=0 }
/end;/ { b=1 }
/^$/ && b { next }
!length && !b { print }
' | tac
我正在运行相同的awk
,但是我将end;
部分(tac
)的文件反转了。
awk
的解释:
length
),则将其打印并将b
设置为0
(false)begin
开头(忽略空白字符[\s
]),请将b
设置为1
(是)^$
,并且b
为真(我们在begin
之后为1行),请跳过此行(next
)begin
之后,请打印(因为我们不想消除所有空白行)