使用 bash 脚本进行代码格式化
Code formatting with bash script
我想搜索一个文件并找到最后一个非空白字符是逗号的所有实例,并将该行下方的行向上移动。本质上,撤消像
这样的行延续
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 在评论中建议的那样,我们需要一个像 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
- 追加当前行以保留 space
1h
- 如果这是第一行,用它覆盖 space
$!d
- 如果这不是最后一行,删除模式 space 并跳转到下一行。
x
- 交换保留和模式 space 以将整个文件放入模式 space
s/,[[:blank:]]*\n[[:blank:]]*/, /g
这将查找以逗号结尾的行,可以选择后跟空格,然后是换行符并替换它,以及下一行中的任何前导 space,用逗号和单个 space.
我认为对于大文件 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 ,这个脚本看起来有点可怕而且不够健壮。事实上,其中的每个操作都是精确的(而且更快,因为它们是内置函数)。
由于您正在处理代码文件,因此我建议您尝试一下。
这是一个 perl 解决方案。
猫文件 | perl -e '{$c = 0; while () { s/^\s+/ / 如果 ($c); s/,\s*$/,/;打印($_); $c = (m/,\s*$/) ? 1: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}
};
有什么好的方法吗?
正如 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
- 追加当前行以保留 space1h
- 如果这是第一行,用它覆盖 space$!d
- 如果这不是最后一行,删除模式 space 并跳转到下一行。x
- 交换保留和模式 space 以将整个文件放入模式 space
s/,[[:blank:]]*\n[[:blank:]]*/, /g
这将查找以逗号结尾的行,可以选择后跟空格,然后是换行符并替换它,以及下一行中的任何前导 space,用逗号和单个 space.
我认为对于大文件 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 ,这个脚本看起来有点可怕而且不够健壮。事实上,其中的每个操作都是精确的(而且更快,因为它们是内置函数)。 由于您正在处理代码文件,因此我建议您尝试一下。
这是一个 perl 解决方案。
猫文件 | perl -e '{$c = 0; while () { s/^\s+/ / 如果 ($c); s/,\s*$/,/;打印($_); $c = (m/,\s*$/) ? 1:0; }}'