0

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

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}
};

有没有好的方法来做到这一点?

4

4 回答 4

2

正如 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

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

于 2015-11-09T18:11:28.753 回答
2

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

awk -vRS=", *\n" -vORS=", " '1' file
于 2015-11-09T19:02:22.537 回答
0

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

这是一个演示

于 2015-11-10T00:01:14.593 回答
0

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

于 2015-11-10T01:20:52.613 回答