2

#include ステートメントのファイル名が *.h ファイルと正確に一致しない C/C++ ソース コードの本体があります。一致は正しいですが、大文字と小文字は区別されません。これは、Windows システムで発生するソース ファイルのタイプです。

#includeすべてのステートメントが参照するファイル名と完全に一致するように、すべてのソース ファイルを変更したいと考えています。

変更するファイル名はすべて引用符で囲みます。

例:

ファイル一覧

File1.h
FILE2.H
file1.cpp

file1.cpp

#include "file1.h"
#include "file2.h"

file1.cpp を次のように変更します

#include "File1.h"
#include "FILE2.H"

この更新を実行する自動スクリプトを作成したいと考えています。

このプロセスの一部である以下の手順をリストしましたが、それらをまとめることはできないようです.

  1. すべての *.h ファイルのリストを作成しますls *.h > include.lst。これにより、すべてのファイル名の大文字と小文字が正しいファイルが作成されます。
  2. でファイル名を使用して、大文字と小文字を区別しない検索を実行し、一致したものを適切に大文字と小文字が区別されたファイル名に置き換えるinclude.lstsed コマンドを作成します。's/<filename>/<filename>/I'置換は 1 回だけでよいと思いますが、グローバル g を追加すると、複数の発生に対処できます。
  3. この置換リストをディレクトリ内のすべてのファイルに適用します。

与えられた sed コマンド 2) の作成方法に関する提案をお願いしますinclude.lst。私は残りを処理できると思います。

4

5 に答える 5

2
  1. スクリプトで使用sedするか、Perl スクリプトを使用します。

    find . -name *.c -print0 | xargs -0 sed -i.bak -e "s/\#include\s\"\([^\"]+/)\"/\#include\s\"\L\1\"/"
    

    -i.bakファイルを にバックアップするoriginal_file_name.bakので、失敗しても心配する必要はありません。

    この行は、C ファイルのすべてのヘッダー インクルードを小文字に変更します。

  2. 次に、すべてのファイル名を変更します。

    find . -name *.h -print0 | xargs -0 rename 's/(*)/\L\1/'
    

    これにより、すべてのヘッダー ファイルの名前が小文字に変更されます。

これは Linux 専用です。Windows を使用している場合は、上記のすべてに Perl または Python スクリプトを使用することをお勧めします。

于 2012-11-07T21:56:08.550 に答える
2
for hfile in $(find /header/dir -type f -iname '*.h'); do
    sed -i 's/#include "'$hfile'"/#include "'$hfile'"/gI' file1.cpp
done

見積もりが正しかったことを願っています:)-i応募する前に試してみてください。

sed次のように、別のループで呼び出しをラップできます。

for hfile in $(find /header/dir -type f -iname '*.h'); do
    for sfile in $(find /source/dir -type f -iname '*.cpp'); do
        sed -i 's/#include "'$hfile'"/#include "'$hfile'"/gI' "$sfile"
    done
done
于 2012-11-07T21:25:46.103 に答える
0

これはうまくいくかもしれません(GNU sed):

sed 's|.*|s/^#include "&"$/#include "&"/i|' list_of_files | sed -i -f - *.{cpp,h} 
于 2012-11-07T23:55:04.197 に答える
0

小文字のファイル名と #include 文字列に関するすべての詳細をありがとう。ただし、私の最初の質問は、文字通りの置換を実行することでした。

以下は、私の要件を満たす基本的なコマンドと sed スクリプトです。

ls *.h *.H | sed -e "s/\([^\r\n]*\)/s\/\\\(\\\#include\\\s\\\"\\\)\1\\\"\/\\\1\1\\\"\/gi/g" >> sedcmd.txt

  1. ls *.h *.Hファイルのリストを一度に 1 行ずつ作成します
  2. このリストを sed にパイプします。
  3. ファイル名である行全体を検索します。ライン全体をグループ 1 に入れます。s/\(^\r\n]*\)/
  4. ファイル名の行全体を文字列に置き換えますs/\(\#include\s"\)<filename>"/\1<filename>"/gi

文字列#include<space>"はグループ 1 に配置されiますgi。大文字と小文字を区別しない検索を行う状態です。これgは、通常のグローバル検索と置換です。

ファイル名 ACCESS.H と cancel.h を指定すると、スクリプトの出力は次のようになります。

s/\(\#include\s"\)ACCESS.H"/\1ACCESS.H"/gi
s/\(\#include\s"\)cancel.h"/\1cancel.h"/gi

最後に、sed コマンド ファイルを次のコマンドで使用できます。

sed -i.bak -f sedcmd.txt *.cpp *.h
于 2012-11-08T07:49:18.713 に答える