我一直在到处寻找。没有找到答案,所以我期待你!
我的工作中的程序输出许多*.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" {} +
所有上述方法都会递归到子目录中。