簡體   English   中英

刪除不必要的空行

[英]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我創建了兩個正則表達式:

  1. 查找: begin(\\n)*和替換: begin\\n
  2. 查找: (\\n)*([[:space:]])*end; 並替換: \\nend;

我的問題:

  1. 如何轉換兩個正則表達式,以便它們可以與sed (就地)一起使用?
  2. 第二個正則表達式刪除關鍵字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解釋:

  1. 如果該行不為空( length ),則將其打印並將b設置為0 (false)
  2. 如果該行以字符串begin (忽略空白字符[ \\s ]),則將b設置為1 (true)
  3. 如果該行為空( ^$ ),且b為真(我們在begin后為1行),則跳過此行( next
  4. 如果該行為空白且我們不是在begin之后打印(因為我們不想消除所有空白行)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM