[英]Remove unnecessary blank lines
讓我們假設以下代碼示例有效:
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;
前的所有現有空格end;
。 怎么可以修復這個問題? 使用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'
不是最優雅的解決方案,但我會繼續嘗試這個:)
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
(true) ^$
),且b
為真(我們在begin
后為1行),則跳過此行( next
) begin
之后打印(因為我們不想消除所有空白行)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.