用bash脚本格式化代码
我想搜索一个文件,找到最后一个非空字符是逗号的所有实例,并将下面的行向上移动。从本质上讲,撤消线延续,如用bash脚本格式化代码,bash,format,continuation,Bash,Format,Continuation,我想搜索一个文件,找到最后一个非空字符是逗号的所有实例,并将下面的行向上移动。从本质上讲,撤消线延续,如 private static final double SOME_NUMBERS[][] = { {1.0, -6.032174644509064E-23}, {-0.25, -0.25}, {-0.16624879837036133, -2.6033824355191673E-8} }; 并将其转化为 private static final double SOM
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;$!Dx代码> 这一系列命令读取整个文件。把它看作一个成语可能是最简单的。如果你真的想知道血淋淋的细节:
-追加当前行以保留空格H
-如果这是第一行,则用它覆盖保留空间1h
-如果这不是最后一行,请删除图案空间并跳到下一行李>$!d
-交换保留和模式空间,将整个文件放入模式空间x
这将查找以逗号结尾的行(可选地后跟空格,后跟换行符),并用逗号和单个空格替换该行以及下一行的任何前导空格s/,[[:blank:][]*\n[[:blank:][]*/,/g
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;$!Dx代码> 这一系列命令读取整个文件。把它看作一个成语可能是最简单的。如果你真的想知道血淋淋的细节:
-追加当前行以保留空格H
-如果这是第一行,则用它覆盖保留空间1h
-如果这不是最后一行,请删除图案空间并跳到下一行李>$!d
-交换保留和模式空间,将整个文件放入模式空间x
这将查找以逗号结尾的行(可选地后跟空格,后跟换行符),并用逗号和单个空格替换该行以及下一行的任何前导空格s/,[[:blank:][]*\n[[:blank:][]*/,/g
- 我认为对于大文件
awk
会更好:
awk -vRS=", *\n" -vORS=", " '1' file
我认为对于大文件
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,那么这个脚本似乎有点吓人,也不健壮。事实上,它的每个操作都是精确的(而且更快,因为它们是内置函数)。
因为您正在处理一个代码文件, 我建议你试试
在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解决方案。
cat文件| perl-e'{$c=0;while(){s/^\s+//if($c);s/,\s*$/,/;print($);$c=(m/,\s*$/)?1:0;}}'这是一个perl解决方案。
cat文件| perl-e'{$c=0;while(){s/^\s+//if($c);s/,\s*$/,/;print($);$c=(m/,\s*$/)?1:0;}}'您为此尝试过什么吗?假设您没有任何范围/等来应用它,并且没有任何不希望应用它的行,那么这应该是一个相当简单的
sed
或awk
脚本。我认为像sed s/,\n//g
(概念上)这样的操作会起作用,但我对sed非常熟悉。另外,这只适用于,\n
而不适用于,\n
,我希望它能够处理,
和\n
之间的任何空格量,而sed
是逐行工作的,因此无法匹配\n
(默认情况下),是的。您为此尝试过什么吗?假设您没有任何范围/等来应用它,并且没有任何不希望应用它的行,那么这应该是一个相当简单的sed
或awk
脚本。我认为像sed s/,\n//g
(概念上)这样的操作会起作用,但我对sed非常熟悉。另外,这只适用于,\n
而不适用于,\n
,我希望它能够处理,
和\n
之间的任何空格量,而sed
是逐行工作的,因此无法匹配\n
li