2017-01-17 1 views
0

ファイル数が.cで、printfの行を探したいのですが、それらの行には//を追加してコードをコメントアウトします。私は、Pythonを使用して各ファイルを読み込み、変換を行い、変換されたテキストを書き戻すことができますが、それは複雑すぎます。他に簡単な方法はありますか?私はsedawkのようなものを考えましたが、式を書く方法がわからない、またはsed/awkを使ってこのタスクを完了することができるかどうかはわかりません。テキストファイルの特定の行を見つけて、いくつかの操作を行うにはどうすればよいですか?

+0

のコマンドラインと同等の単一の行のコマンドラインに優しいバージョンを使用しますあなたのコードが書かれている特定のC変種のパーサーなしで、この仕事を頑強にすることはできません。入力ファイルの内容によっては、投稿された回答が失敗します。 –

答えて

3

awk。そこにはサンプルデータがなかったと私は周りに何の.cファイルがなかったように、それは未テストです:

$ awk '/printf/ { sub(/^/,"//") } 1' *.c 

を説明:レコードの

  • /printf/printfでそれらに
  • sub(/^/,"//")を記録//の先頭に追加します
  • 1暗黙印刷

この解決法は、いくつかのファイルを処理するのに少し問題があるかもしれない出力をstdoutに出力します。それに対処する1つの方法は、Gnu awk v。4.1.0以上とinplace editgawk -i inplaceを使用することです。 もう1つの方法は、暗黙的な印刷を{ print > "edited-" FILENAME }に変更して、編集した各ファイルを新しいファイル(たとえばfile.cedited-file.c)に印刷するなど、他のファイルに出力することです。率直に言って、私は@ satのsed解決策を自分で使っています。 sed

5

インプレース編集のために@SLePort、

sed 's~.*printf~//&~' *.c 

使用-iによって推奨

sed '/printf/s~^~//~g' *.c 

正確printfをマッチングするための別の方法(printfと仮定すると、常に改行で起動):edUNIX -days(ポータブル、POSIX互換)と行うためのループから利用可能な標準エディタを使用して

sed 's~^\([\t ]*\)\(printf\)~\1//\2~g' file 
+0

またはおそらく 'sed '〜* printf〜//&〜''。そして、私は 'g'修飾子がここで有用であるかどうか分からない。 – SLePort

3

イン場所の交換、

for i in *.c; do 
    printf '%s\n' ",g/printf/ s/^/\/\//" w q | ed -s -- "$i" 
done 

で、

,g/printf/ s/^/\/\// 

,g/printf/すべての行にprintfs/^/\/\//を含む行には、これらの行に単語//が追加されます。その後、wqはファイルを書き込み、その後にそれを閉じます。

いいえ、それはexエディタを使用して

for i in *.c; do printf '%s\n' ",g/printf/ s/^/\/\//" w q | ed -s -- "$i"; done 

(または)、などVim

for i in *.c; do printf '%s\n' "%g/printf/ s/^/\/\//" w q | ex -s "$i"; done 
+1

_file_ ':)'を編集して_ _ _ _ _ _ _ _ _ _ _ _ _エディタ_を使用してくれてありがとうございました。 –

+1

スニフ、それらは本当に良いolの日だった。 ++ –

1
sed '/printf/ s/^/\/\//' filename 
関連する問題