2

「モデル」というフォルダがあります。その中で、「Test_Dbv3」という用語のすべてのインスタンスを「TestDbv3」に置き換える必要があります。test_host.hbm.xml、test_host2.hbm.xml、testHost.java、testHost2.java などの名前のファイルが複数あります。Unixコマンドまたは任意の言語のスクリプトを使用してこれを行う方法はありますか?

私はRHEL5に取り組んでいます。

4

2 に答える 2

18

sedfindおそらく動作するはずです:

find . -type f -exec sed -e 's/Test_Dbv3/TestDbv3/g' -i.bak '{}' +

適切な名前のfindコマンドは、ファイルを検索します。ここでは、.ファイル ( ) である現在の作業ディレクトリ ( )内のファイルを検索しています-type f。これらのファイルを使用して-exec、コマンドに進みます: sed. は、コマンドの終了を示し、オペレーティング システムが許可する限り多くのファイル+に置き換えたいことを示します。{}

sed指定したコマンドをファイルごと、行ごとに実行します。与えているコマンドは でs/Test_Dbv3/TestDbv3/g、これは「正規表現の一致をTest_Dbv3テキストTestDbv3に置き換え、1 行に複数の置換を許可する」という意味です。元の-i.bakファイルを結果に置き換え、変更されていないバージョンをファイル名の末尾に.bak.

于 2013-06-15T02:40:48.973 に答える
2

s/_//g すべてを消したいと仮定した場合の正規表現です_。それ以外の場合は、正規表現を指定する方法を推測する必要があります:

  • たとえば、行の先頭にある場合はandに 置き換えs/^(Test|test)_/$1/gます。test_testTest_Test

  • またはs/^(test)_/$1/gi 、すべてTEST_tEsT_、 など に対してさらに機能します。

  • forperl -pi -e 's/.../.../gi' または GNUsed以上でのみ使用でき、sedコマンドでは使用できない完全に大文字と小文字を区別しない一致が必要であると判断した場合 (変数のような$1ものでさえありませんよね?)

  • のように始まるファイル名もあれば、あなたが言及したTest2_or だけでなく、3〜10文字の長さの文字と数字のすべての組み合わせに一致させるために1EXPERIMENT_ 使用することができ ます。s/^([A-Za-z0-9]{3,10})_/$1/gTesttest

  • さらに具体的な正規表現については、「正規表現チートシート」を検索してください。単一のツールがすべてをサポートしているsed場合やgrepサポートしていない場合は、それらを使用することに決めたとしても不思議ではありません。

  • フォルダー内のファイルの名前を変更するだけで、その内容を編集しないコマンドが必要な場合は、 (rename 's/search/relace/' folder/* サブディレクトリを一致させない) またはrename search replace folder/* (名前の変更のバージョンに応じて) を試してください。

于 2013-06-16T06:11:52.503 に答える