删除不必要的空白行

时间:2019-08-07 16:47:09

标签: bash shell

让我们想象以下代码示例有效:

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;之前删除所有现有的空格。如何解决此问题?

2 个答案:

答案 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的解释:

  1. 如果该行不为空(length),则将其打印并将b设置为0(false)
  2. 如果该行以字符串begin开头(忽略空白字符[\s]),请将b设置为1(是)
  3. 如果该行为空(^$,并且b为真(我们在begin之后为1行),请跳过此行(next
  4. 如果该行为空白并且我们不在begin之后,请打印(因为我们不想消除所有空白行)