1

Windowsプラットフォームで開発されたC++コードベースをLinux/GCCに移植しています。作者はファイル名の大文字小文字を気にしなかったようですので、

#include "somefile.h"

それ以外の

#include "SomeFile.h"

実際に「SomeFile.h」と呼ばれるファイルを含めます。これらのインクルードを自動的に修正するツールがあるかどうか疑問に思いましたか?ファイルはすべて1つのディレクトリにあるため、ツールが正しい名前を簡単に見つけることができます。

4

3 に答える 3

3

編集:何かをする前に、ファイルのコピーが横にあるか、何らかの理由でロールバックする必要がある場合にソース管理にベースラインバージョンがあることを前提としていることに注意してください。

あなたはこれを行うことができるはずですsed:のようなものsed -i 's/somefile\.h/SomeFile.H/I' *.[Ch]

これは、大文字と小文字を区別しないsomefile(末尾)を取り、他のテキスト/Iでインプレース(同じファイル)置換( )を行うことを意味します。-iSomeFile.H

ループでそれを行うこともできます(完全にテストされていません):

for file in *.[Ch]
do
    sed -i "s/$file/$file/I" *.[Ch]
done

sedこれがあなたに当てはまるとは思わないが、Solarisはサポートしておらず-i、GNU sedをインストールするか、ファイルにリダイレクトして名前を変更する必要があることに注意してください。

于 2012-07-31T15:39:57.860 に答える
1

許してください。私は今Linux環境から離れているので、これを自分でテストすることはできませんが、それを行うために使用する必要のあるユーティリティを教えてくれます。

  1. ターミナルを開き、を使用cdして正しいディレクトリに移動します。

    cd ~/project

  2. 必要なすべての.hファイルのリストを取得します。シェルのワイルドカード拡張を使用すると、何の努力もせずにこれを実現できるはずです。

    ls include/*.h libs/include/*.h

  3. プロジェクト全体(.c、.cpp、.h、.whatever)のすべてのファイルのリストを取得します。#include"header.h"を含めることができるものはすべて取得します。繰り返しますが、ワイルドカード拡張。

    ls include/*.h libs/include/*.h *.cpp libs/*.cpp

  4. forループを使用してプロジェクト内の各ファイルを反復処理します

    for f in ... # wildcard file list
    do
        echo "Looking in $f"
    done
    
  5. forループを使用して各ヘッダーファイルを反復処理します

    for h in ... # wildcard header list
    do
        echo "Looking for $h"
    done
    
  6. 各プロジェクトファイルのヘッダーごとに、を使用sedして検索し、または正しい大文字と小文字#include "headerfilename.h"を置き換えます。#include "HeaderFileName.h"

    警告:テストされておらず、おそらく危険です: これは開始する場所であり、使用する前に徹底的にテストする必要があります。

    h_escaped=$(echo $h | sed -e 's/\([[\/.*]\|\]\)/\\&/g') # escapes characters in file name
    argument="(^\s*\#include\s*\")$h_escaped(\"\s*\$)" # I think this is right
    sed -i -e "s/$argument/\$1$h\$2/gip"` 
    

    はい、私はそれがひどいように見えることを知っています。

考慮事項:

  • これを本番コードベースで直接実行するのではなく、最初に徹底的にテストしてください。
  • sedVCRがテープを食べることができるようにファイルを食べることができます。
  • バックアップを作成します。
  • 別のバックアップを作成します。
  • これはハードディスクアクセスを伴うO(N ^ 2)操作であり、プロジェクトが大きい場合は実行が遅くなります。プロジェクトが巨大でない場合は、気にしないでください。巨大な場合は、sedの出力を他sedのプロジェクトにパイプするために何かを行うことを検討してください。
  • 検索では大文字と小文字を区別しない必要があります。#include、#INCLUDE、#iNcLuDe、および既存のヘッダーファイル名に存在する大文字と小文字の組み合わせ、およびインクルードとヘッダーの間の空白の量と一致する必要があります。空白を保持する場合のボーナスポイント。
于 2012-07-31T16:40:01.357 に答える
0

Notepad ++を使用して、「ファイル内の検索」を実行し、置き換えます。

ツールバーから:検索-ファイルで検索。次に、「検索対象」と「置換」を完了します。

于 2012-07-31T15:36:05.593 に答える