2009-05-20 9 views
2

sedを使用してファイル内のブロックを置き換えようとしていますが、成功しません。sedのブロック置換

など。 私はこの置き換えたい:以下は、トリックを行いますが、非常に基本的な方法で、すなわち、それは堅牢ではありませんもそれはフォーマットで心配ない

int i = 0; 
while(i < MAX_LOOPS) { 
    printf("Hello World!"); 
    ++i; 
} 
+0

なぜあなたはために?私にとっては、読みやすさと保守性の大幅な低下があるようです。 – hlovdal

+0

ここでの難しさは、while(){}ループ内で必要なものです。単純な命令の場合は1つですが、ネストされたブロックなどの場合は別のものです。 – Beano

答えて

1

:これにより

for(int i = 0; i < MAX_LOOPS; ++i) { 
    printf("Hello World!"); 
} 

を。

S /について(I = 0をint型;私< MAX_LOOPS; ++ i)は/ INT I = 0; \のnwhile(I < MAX_LOOPS)/グラム /のprintf( "Hello Worldの!");/{ a ++ i; }

これはちょうど速いハックですが、それはあなたを動かすのに十分であるはずです。 Sedはこの仕事のための最善のツールではないかもしれませんが、Sedでそれを行う方法を知っても害はありません。

0

このあなたのために働くかもしれない:

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 
} 
0
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 
} 
0
sed -e ' 
    /for(int i = 0; i < MAX_LOOPS; ++i) {/,/}/ { 
     /}/ a \ 
int i = 0;\ 
while(i < MAX_LOOPS) {\ 
    printf("Hello World!");\ 
    ++i;\ 
} 
     d 
     } 
    ' YourFile 
  • は、(i = 0をint型;私< MAX_LOOPS; ++ i)がために間のすべての行を削除し、{}
  • に達したとき}新しいコンテンツを追加します(b入力行を削除する前に。

入力と出力の間で異なる動作を使用します。この情報を現在の作業バッファに入れずに(出力と入力)、削除はこれに触れることはできませんが、入力(現在の行)はです)

関連する問題