Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix shell脚本,用于删除左括号后的空行_Unix_Vim_Shell_Sed_Awk - Fatal编程技术网

Unix shell脚本,用于删除左括号后的空行

Unix shell脚本,用于删除左括号后的空行,unix,vim,shell,sed,awk,Unix,Vim,Shell,Sed,Awk,我需要一个(sed,awk)shell脚本,或者更好的是,需要一个Vim命令来删除一行后面的任何空白行,该行带有一个开放的花括号。比如说, void func() { foo(); } void bar() { helloWorld(); } 应该成为 void func() { foo(); } void bar() { helloWorld(); } 有什么想法吗?试试这个: $ awk 'NF{f=0}/^ *{/{ f=1 } f==1 &a

我需要一个(sed,awk)shell脚本,或者更好的是,需要一个Vim命令来删除一行后面的任何空白行,该行带有一个开放的花括号。比如说,

void func()
{


    foo();
}

void bar()
{

    helloWorld();
}
应该成为

void func()
{
    foo();
}

void bar()
{
    helloWorld();
}
有什么想法吗?

试试这个:

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



}
一点解释:

  • /^*{
    表示在第一个
    {
    之前搜索0个或更多空格
  • 然后将标志设置为true(
    f=1
  • 当读取下一行且
    f
    为真且
    !NF
    (表示没有字段,即该行为空)时,使用
    next
    跳过行
  • 如果下一行不是空行(即,
    NF{f=0}
    意味着切换回标志),则在下一个大括号打开之前,其余行不会受到影响
  • 维姆:


    在Vim中实现这一点的最简单方法可能是 替代:

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

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

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

    这是相当短的。我希望它能工作。-(<)/P>@ Goodo77:在打开括号之后删除空白行,但也可以删除所有其他空行……很好,谢谢。我仍然在想,看看GAWK手册,它是如何工作的……安德烈亚斯:我想你不会发现最后一个“1”。在手册页或信息文件中。将在第一个{之前添加一个^。可能可以改进以处理一行中的一个{,但前面有空格/空格。类似于这样,我认为:

    :%s/^\(\s*{\)[\s\n]*/\1\r/
    您不想要
    :%s/^\(\s*{\)\%(\s*\n\)*/\1\r/
    这样就不会消除
    {
    ?@kejadlen:答案中的命令并没有消除大括号前面的空格,因为模式中的
    \zs
    说明符将匹配的开始设置为大括号后面的换行符之后的替换,从而使所有匹配的字符保持在该点之前(请参见
    :help/\zs
    )。
    :g /{/ s/\n\+/\r/