如何将多行路径重写为一行相对路径

如何将多行路径重写为一行相对路径

我一直在到处寻找。没有找到答案,所以我期待你!

我的工作中的程序输出许多*.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,但它始终是第二该词的出现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相同的文件夹结构模式输出文件,但在文件内部,绝对路径通过81. char 位置PC分隔到新行:-

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 个字符,因此将出现带有两个分隔符的三行路径-

我无法理解如何编写一个可以使用这些多行的脚本,以便路径变量可以缩短到../../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" {} +

所有上述方法都会递归到子目录中。

相关内容