Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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/svg/2.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
用bash脚本格式化代码_Bash_Format_Continuation - Fatal编程技术网

用bash脚本格式化代码

用bash脚本格式化代码,bash,format,continuation,Bash,Format,Continuation,我想搜索一个文件,找到最后一个非空字符是逗号的所有实例,并将下面的行向上移动。从本质上讲,撤消线延续,如 private static final double SOME_NUMBERS[][] = { {1.0, -6.032174644509064E-23}, {-0.25, -0.25}, {-0.16624879837036133, -2.6033824355191673E-8} }; 并将其转化为 private static final double SOM

我想搜索一个文件,找到最后一个非空字符是逗号的所有实例,并将下面的行向上移动。从本质上讲,撤消线延续,如

private static final double SOME_NUMBERS[][] = {
    {1.0, -6.032174644509064E-23},
    {-0.25, -0.25},
    {-0.16624879837036133, -2.6033824355191673E-8}
};
并将其转化为

private static final double SOME_NUMBERS[][] = {
    {1.0, -6.032174644509064E-23}, {-0.25, -0.25}, {-0.16624879837036133, -2.6033824355191673E-8}
};

有什么好方法可以做到这一点吗?

正如mjswartz在评论中建议的那样,我们需要一个sed替换命令,如
s/,\n//g
。然而,这本身并不起作用,因为默认情况下,sed一次只读取一行。我们可以通过先读取整个文件,然后进行替换来解决此问题:

$ sed 'H;1h;$!d;x; s/,[[:blank:]]*\n[[:blank:]]*/, /g;' file
private static final double SOME_NUMBERS[][] = {
    {1.0, -6.032174644509064E-23}, {-0.25, -0.25}, {-0.16624879837036133, -2.6033824355191673E-8}
};
因为这会同时读取整个文件,所以对于大型文件来说,这不是一个好方法

以上内容已通过GNU sed进行了测试

工作原理
  • H;1h;$!Dx

    这一系列命令读取整个文件。把它看作一个成语可能是最简单的。如果你真的想知道血淋淋的细节:

    • H
      -追加当前行以保留空格
    • 1h
      -如果这是第一行,则用它覆盖保留空间
    • $!d
      -如果这不是最后一行,请删除图案空间并跳到下一行
    • x
      -交换保留和模式空间,将整个文件放入模式空间
  • s/,[[:blank:][]*\n[[:blank:][]*/,/g

    这将查找以逗号结尾的行(可选地后跟空格,后跟换行符),并用逗号和单个空格替换该行以及下一行的任何前导空格


正如mjswartz在评论中所建议的,我们需要一个sed替换命令,如
s/,\n//g
。然而,这本身并不起作用,因为默认情况下,sed一次只读取一行。我们可以通过先读取整个文件,然后进行替换来解决此问题:

$ sed 'H;1h;$!d;x; s/,[[:blank:]]*\n[[:blank:]]*/, /g;' file
private static final double SOME_NUMBERS[][] = {
    {1.0, -6.032174644509064E-23}, {-0.25, -0.25}, {-0.16624879837036133, -2.6033824355191673E-8}
};
因为这会同时读取整个文件,所以对于大型文件来说,这不是一个好方法

以上内容已通过GNU sed进行了测试

工作原理
  • H;1h;$!Dx

    这一系列命令读取整个文件。把它看作一个成语可能是最简单的。如果你真的想知道血淋淋的细节:

    • H
      -追加当前行以保留空格
    • 1h
      -如果这是第一行,则用它覆盖保留空间
    • $!d
      -如果这不是最后一行,请删除图案空间并跳到下一行
    • x
      -交换保留和模式空间,将整个文件放入模式空间
  • s/,[[:blank:][]*\n[[:blank:][]*/,/g

    这将查找以逗号结尾的行(可选地后跟空格,后跟换行符),并用逗号和单个空格替换该行以及下一行的任何前导空格


    • 我认为对于大文件
      awk
      会更好:

      awk -vRS=", *\n" -vORS=", " '1' file
      

      我认为对于大文件
      awk
      会更好:

      awk -vRS=", *\n" -vORS=", " '1' file
      

      在lua shell上,只需这样写:

      function nextlineup()
          vim:normal("j^y$k$pjddk")
      end
      
      vim:open("code.txt")
      vim:normal("G")
      while vim:k() do
          vim:normal("$") 
          if(vim.currc == string.byte(',')) nextlineup();
      end
      
      如果您不熟悉vim,那么这个脚本似乎有点吓人,也不健壮。事实上,它的每个操作都是精确的(而且更快,因为它们是内置函数)。 因为您正在处理一个代码文件, 我建议你试试


      在lua shell上,只需这样写:

      function nextlineup()
          vim:normal("j^y$k$pjddk")
      end
      
      vim:open("code.txt")
      vim:normal("G")
      while vim:k() do
          vim:normal("$") 
          if(vim.currc == string.byte(',')) nextlineup();
      end
      
      如果您不熟悉vim,那么这个脚本似乎有点吓人,也不健壮。事实上,它的每个操作都是精确的(而且更快,因为它们是内置函数)。 因为您正在处理一个代码文件, 我建议你试试


      这是一个perl解决方案。

      cat文件| perl-e'{$c=0;while(){s/^\s+//if($c);s/,\s*$/,/;print($);$c=(m/,\s*$/)?1:0;}}'

      这是一个perl解决方案。

      cat文件| perl-e'{$c=0;while(){s/^\s+//if($c);s/,\s*$/,/;print($);$c=(m/,\s*$/)?1:0;}}'

      您为此尝试过什么吗?假设您没有任何范围/等来应用它,并且没有任何不希望应用它的行,那么这应该是一个相当简单的
      sed
      awk
      脚本。我认为像
      sed s/,\n//g
      (概念上)这样的操作会起作用,但我对sed非常熟悉。另外,这只适用于
      ,\n
      而不适用于
      ,\n
      ,我希望它能够处理
      \n
      之间的任何空格量,而
      sed
      是逐行工作的,因此无法匹配
      \n
      (默认情况下),是的。您为此尝试过什么吗?假设您没有任何范围/等来应用它,并且没有任何不希望应用它的行,那么这应该是一个相当简单的
      sed
      awk
      脚本。我认为像
      sed s/,\n//g
      (概念上)这样的操作会起作用,但我对sed非常熟悉。另外,这只适用于
      ,\n
      而不适用于
      ,\n
      ,我希望它能够处理
      \n
      之间的任何空格量,而
      sed
      是逐行工作的,因此无法匹配
      \n
      li