我想搜索一个文件,找到最后一个非空白字符是逗号的所有实例,并将该行下面的一行移动到一个。基本上,撤消行继续,如
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}
};
有没有好办法呢?
答案 0 :(得分:2)
正如mjswartz在评论中建议的那样,我们需要一个像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
这将查找以逗号结尾的行,可选地后跟空格,后跟换行符,并使用逗号和单个空格替换该行以及后续行中的任何前导空格。
答案 1 :(得分:2)
我认为对于大文件awk
会更好:
awk -vRS=", *\n" -vORS=", " '1' file
答案 2 :(得分: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,这个脚本似乎有点可怕而且不健壮。实际上,其中的每个操作都是精确的(并且更快,因为tey是内置函数)。 由于您正在处理代码文件,我建议您尝试一下。
答案 3 :(得分:0)
这是一个perl解决方案 猫文件| perl -e' {$ c = 0; while(){s / ^ \ s + / / if if($ c); S / \ S * $ /,/;打印($ _); $ c =(m /,\ s * $ /)? 1:0; }}'