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 -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
}