我有一个这样的文件夹结构:
----src/
----foo.cpp
----bar.cpp
因此,foo.cpp
是:
#pragma once
#include "foo.h"
void FOO::func1(){
printf("Foo Func1n");
}
void func2(){
printf("Func2n");
}
我想重写这个文件,在函数实现之间以及函数实现之前和之后只有一行空行。也就是说,在任何函数实现内部和函数实现外部,我都希望删除所有空行。我希望foo.cpp
被这样转换:
#pragma once
#include "foo.h"
void FOO::func1(){
printf("Foo Func1n");
}
void func2(){
printf("Func2n");
}
CCD_ 3也是。在这种情况下,是否可以在给定文件夹/src/
中的所有文件上编写并运行脚本/批处理(linux或windows也可以(。
其他细节:我目前的做法是打开vim
中的每个文件,使用{
和}
在带我到下一个空行的vim
段落之间导航,如果要删除该行,则dd
删除该行。
@ECHO OFF
SETLOCAL
rem The following settings for the source directory, destination directory, target directory,
rem batch directory, filenames, output filename and temporary filename [if shown] are names
rem that I use for testing and deliberately include names which include spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.
SET "sourcedir=u:your files"
SET "destdir=u:your results"
FOR /f "delims=" %%a IN (
'dir /b /a-d "%sourcedir%*.cpp" '
) DO >"%destdir%%%a" (
FOR /f "tokens=1*delims=]" %%c IN ('find /n /v "" ^<"%sourcedir%%%a"') DO (
FOR /f %%t IN ("%%d") DO (
ECHO %%d
FOR %%m IN (} #include) DO IF /i "%%t"=="%%m" echo/
)
)
)
GOTO :EOF
%%a
循环依次将每个.cpp
文件名分配给%%a
。
%%c
循环读取文件中的每一行,并使用find
实用程序(注意:Microsoft的cmd
实用程序find
(在该行前面加上方括号中的行号,然后生成的行被标记,[number
到%%c
,remainder of line after ]
到%%d
。
%%t
循环找到该行上的第一个令牌(如果存在(,然后对该行进行反运算,如果第一个令牌是(%%m
处理的列表中的任何字符串(,则添加一个空行。我将/i
添加到if
,以使匹配不区分大小写。
作为检查,我会使用
fc /w "sourcedirectoryname*.cpp" "destinationdirectoryname*.cpp"
它应该在原始文件和处理过的文件之间执行文件比较,而不考虑空白。
源目录和目标目录必须不同,否则批处理将试图覆盖它正在读取的文件。这不会有什么好处。
vim解决方案:
vim *.cpp
:silent! argdo g/){$/,/^}/ s/^n//g
:silent! argdo g/v(^n){2,}/d | update
解释上述命令
THE FIRST COMMAND
opening all files with a wildcard we create in vim an arglist
a list of all files we give as arguments
THE SECOND COMMAND
silently
in all files of our argument list (the arglist)
globally
from /){/
until /^}/
substitute
^n blank lines
// for nothing
THE THIRD COMMAND
v very magic (avoid many backslashes)
(^n) regex group matching blank lines
{2,} two or more
d delete
update -> write all files
您可以使用find命令填充参数列表:
vim $(find *.cpp)
参考文献:
- https://skayal.com/sed-delete-the-lines-lying-in-between-two-patterns/
- https://vim.fandom.com/wiki/Power_of_g