【问题标题】:Code formatting with bash script使用 bash 脚本格式化代码
【发布时间】:2016-02-10 10:18:00
【问题描述】:

我想搜索一个文件并找到最后一个非空白字符是逗号的所有实例,并将其下方的行向上移动一个。本质上,撤消像

这样的续行
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}
};

有什么好办法吗?

【问题讨论】:

  • 你有没有为此尝试过?这应该,假设你没有任何范围/等。在其中应用它并且没有任何您不想希望应用它的行,是一个相当简单的sedawk 脚本。
  • 我认为做类似sed s/,\n/ /g(概念上)的事情会起作用,但我对 sed 还是很陌生。此外,这只适用于,\n 而不是, \n,我希望它能够处理,\n 之间的任意数量的空格
  • 除此之外,sed 逐行工作,因此不能像那样匹配 \n(默认情况下),是的。

标签: bash format continuation


【解决方案1】:

正如 mjswartz 在 cmets 中建议的那样,我们需要一个像 s/,\n/ /g 这样的 sed 替换命令。但是,这本身不起作用,因为默认情况下,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;$!d;x;

    这一系列命令读入整个文件。将其视为成语可能是最简单的。如果你真的想知道血淋淋的细节:

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

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

【讨论】:

  • 这看起来像是替换了逗号,而我想保留它们。我会调整什么让,\n 变成, ?抱歉,如果不清楚
  • @mjswartz 感谢您发现这一点。已修复:解决方案现在保留逗号。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    在 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,这个脚本看起来有点吓人而且不够健壮。事实上,其中的每个操作都是精确的(而且速度更快,因为它们是内置函数)。 由于您正在处理代码文件,我建议您尝试一下。

    here is a demo

    【讨论】:

      【解决方案4】:

      这是一个 perl 解决方案。
      猫文件 | perl -e '{$c = 0; while () { s/^\s+/ / if ($c); s/,\s*$/,/;打印($_); $c = (m/,\s*$/) ? 1:0; }}'

      【讨论】:

        猜你喜欢
        • 2010-11-11
        • 2021-03-23
        • 2023-03-10
        • 1970-01-01
        • 2017-11-06
        • 1970-01-01
        • 1970-01-01
        • 2020-04-12
        • 1970-01-01
        相关资源
        最近更新 更多