複数行パスを1行相対パスに書き換える方法

複数行パスを1行相対パスに書き換える方法

私はあちこちを訪れました。答えが見つかりませんでしたが、お待ちしています!

私の仕事のプログラムは*.pcフォルダ構造で10-50個のファイルをたくさん出力します。

RESULTS/MODEL_Y0/Positioning_1.pc
RESULTS/MODEL_Y0/SK312_2SK_Y0_2012.pc

RESULTS/MODEL_Y100/Positioning_2.pc
RESULTS/MODEL_Y100/SK312_2SK_Y100_2012.pc

RESULTS/MODEL_Y250/Positioning_45.pc
RESULTS/MODEL_Y250/SK312_2SK_-Y575_2012.pc

すべてのPCファイルにはxxxで始まる内部絶対パスがあります(常に101ではありませんが、常に101です)。第二単語)行の発生はINCLU次のとおりです。

INCLU / Positioning_1.pc
INCLU / /ST/statika/AGP-Pedestrian_Ansa-Meta/SK312_2SK_xxx/SK312_SERIE.inc
INCLU / /ST/statika/AGP-Pedestrian_Ansa-Meta/SK312_2SK_xxx/SK312_xPL_impactor.inc
INCLU / /ST/statika/AGP-Pedestrian_Ansa-Meta/SK312_2SK_xxx/SK312_materials.inc

次の絶対パス行を相対パスに変更する必要があります。たとえば、次のようになります。

INCLU / Positioning_1.pc
INCLU / ../../SK312_SERIE.inc
INCLU / ../../SK312_xPL_impactor.inc
INCLU / ../../SK312_materials.inc

フォルダの上に配置したスクリプトを作成してこれを実行しましたRESULTS。 (スクリプトの一部)

grep -rl "${SEARCH}" --include \*.pc ./ | xargs sed -i "s#${SEARCH}#${REPLACE}#g"

どこ:

$SEARCH = /ST/statika/AGP-Pedestrian_Ansa-Meta/SK312_2SK_xxx/
$REPLACE = ../../

しかし、ここに問題があります。いつからパスの長さが81文字を超えています。、プログラムは.pc同じフォルダ構造パターンでファイルを出力しますが、ファイル内では絶対パスがPC81で新しい行に分割されます。文字位置:-

INCLU / Positioning_1.pc
INCLU / /ST/statika/uziv/JVERNER/PROJEKTY/Ansa/AGP-Pedestrian_Ansa-Meta/SK312_2S-
K_xxx/SK312_SERIE.inc
INCLU / /ST/statika/uziv/JVERNER/PROJEKTY/Ansa/AGP-Pedestrian_Ansa-Meta/SK312_2S-
K_xxx/SK312_xPL_impactor.inc
INCLU / /ST/statika/uziv/JVERNER/PROJEKTY/Ansa/AGP-Pedestrian_Ansa-Meta/SK312_2S-
K_xxx/SK312_materials.inc

どこ:

$SEARCH = /ST/statika/uziv/JVERNER/PROJEKTY/Ansa/AGP-Pedestrian_Ansa-Meta/SK312_2SK_xxx/

それが問題だ。私のスクリプトに変数は表示されません$SEARCH。より大きな問題は、パスが180文字を超える可能性があるため、2つの区切り記号を持つ3行のパスが生成されることです-

../../SK312_*.incパス変数を以前のように短く絶対的な行パスに短縮できるように、これらの複数行を使用できるスクリプトを作成する方法はわかりません。

答え1

プログラムが中断された場合はそれを実行する必要がありますsed。たとえば、次のようになります。

grep -rl "${SEARCH}" --include \*.pc ./ | 
    xargs sed -i "s/-$//; s/-\n//; s#${SEARCH}#${REPLACE}#g"

または

grep -rl "${SEARCH}" --include \*.pc ./ |
    xargs perl -i -pe "s/-\n//; s#$SEARCH#$REPLACE#g"

findまたは、次のものを使用できますgrep

find  -type f -name '*.pc' -exec perl -i -pe "s/-\n//; s#$SEARCH#$REPLACE#g" {} +

上記のメソッドはすべて、サブディレクトリとして繰り返されます。

関連情報