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'