【问题标题】:Unix shell script to remove blank lines following opening brackets用于删除左括号后的空行的 Unix shell 脚本
【发布时间】:2011-01-07 17:14:00
【问题描述】:

我需要一个 (sed, awk) shell 脚本,或者更好的是,一个 Vim 命令来删除带有单个左大括号的行之后的任何空行。例如,

void func()
{


    foo();
}

void bar()
{

    helloWorld();
}

应该变成

void func()
{
    foo();
}

void bar()
{
    helloWorld();
}

有什么想法吗?

【问题讨论】:

    标签: unix vim shell sed awk


    【解决方案1】:

    试试这个:

    $ awk 'NF{f=0}/^ *{/{ f=1 } f==1 && !NF{next}1' file
    void func()
    {
        foo();
    
    
    
    }
    

    一点解释:

    1. /^ *{/ 表示在第一个 { 之前搜索 0 个或多个空格。
    2. 然后将标志设置为 true (f=1)。
    3. 当读取下一行并且f 为真且!NF(表示没有字段,即该行为空白)时,使用next 跳过行。
    4. 当下一行不是空行时(即NF{f=0} 表示切换回标志),在下一个左大括号之前其余行不会受到影响。

    【讨论】:

    • @ghostdog74:删除打开括号后的空行,以及所有其他空行...
    • 太好了,谢谢。我仍在试图弄清楚,看看 gawk 手册页,它是如何工作的......
    • @andreas:我认为您不会在手册页或信息文件中找到最后一个“1”。
    【解决方案2】:

    维姆:

    :%s/^{\(\n\s*\)*/{\r    /g
    

    【讨论】:

    • 会在第一个 { 之前添加一个 ^。
    • 也许可以改进以处理一行中的一个 { 但前面有空格/空格。
    • 我认为是这样的::%s/^\(\s*{\)[\s\n]*/\1\r/
    【解决方案3】:

    只是为了好玩,我想用 vim 的全局命令来解决这个问题:

    :g /{/ s/\n\+/\r/
    

    这真是太短了。我希望它有效! :-)

    【讨论】:

      【解决方案4】:

      也许在 Vim 中最简单的方法如下 替换:

      :%s/^\s*{\n\zs\_s*\n//
      

      【讨论】:

      • 你不想要:%s/^\(\s*{\)\%(\s*\n\)*/\1\r/ 这样就不会消除{ 前面的空格吗?
      • @kejadlen:答案中的命令不会消除左大括号前面的空格,因为模式中的 \zs 说明符将匹配的开始设置为正确的替换目的在大括号后面的换行符之后,从而使该点之前的所有匹配字符保持完整(请参阅:help /\zs)。
      猜你喜欢
      • 2016-10-31
      • 2014-07-10
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多