我正在尝试使用 sed 替换文件中的块,但没有成功。
例如我想替换这个:
for(int i = 0; i < MAX_LOOPS; ++i) {
printf("Hello World!");
}
有了这个:
int i = 0;
while(i < MAX_LOOPS) {
printf("Hello World!");
++i;
}
我正在尝试使用 sed 替换文件中的块,但没有成功。
例如我想替换这个:
for(int i = 0; i < MAX_LOOPS; ++i) {
printf("Hello World!");
}
有了这个:
int i = 0;
while(i < MAX_LOOPS) {
printf("Hello World!");
++i;
}
以下将做的伎俩,但以一种非常基本的方式,即它不健壮,也不担心格式化。
s/for(int i = 0; i < MAX_LOOPS; ++i)/int i = 0;\nwhile(i < MAX_LOOPS)/g /printf("Hello World!");/{ a++i; }
这只是一个快速的技巧,但它应该足以让你继续前进。Sed 可能不是完成这项工作的最佳工具,但知道如何在 Sed 中完成它并没有什么坏处。
这可能对您有用:
sed -e '/^for.* {/,/^}/{/for/{i\int i = 0;'\
> -e ';c\while(i < MAX_LOOPS) {'\
> -e '}};/^}/i\++i' file
int i = 0;
while(i < MAX_LOOPS) {
printf("Hello World!");
++i
}
sed -r '
/for\s*\(.*;.*;.*\)/!b
s#.*\((.*);(.*);(.*)\).*#\1\nwhile (\2) {\a\3#
h
s/.*\a//
x
s/\a.*//
:X
N
/}/!{bX}
G
s#(.*)\n(.*)\n(.*)#\1\n \3\n\2#
' file
int i = 0
while ( i < MAX_LOOPS) {
printf("Hello World!");
++i
}
sed -e '
/for(int i = 0; i < MAX_LOOPS; ++i) {/,/}/ {
/}/ a \
int i = 0;\
while(i < MAX_LOOPS) {\
printf("Hello World!");\
++i;\
}
d
}
' YourFile
它使用输入和输出之间的不同行为。将发送信息附加到输出而不将此信息放入当前工作缓冲区(通过输入和修改提供),因此删除无法触及此,但输入(当前行}此处)很好触及