使用bash脚本格式化代码



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

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;$!d;x;

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

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

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

我认为对于大文件,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,这个脚本看起来有点可怕,也不健壮。事实上,其中的每一个操作都是精确的(而且要快得多,因为tey是内置函数)。既然你正在处理一个代码文件,我建议你试试

这是一个演示

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

最新更新