Como reescrever o caminho de múltiplas linhas no caminho relativo de uma linha

2

Eu tenho procurado em todos os lugares. Não encontrou a resposta, então estou olhando para você!

O programa no meu trabalho gera muitos 10 a 50% de arquivos*.pc com estrutura de pastas:

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

Cada arquivo PC tem dentro de caminhos absolutos começando na linha xxx (nem sempre 101, mas é sempre a segunda ocorrência da linha INCLU word) como:

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

Eu preciso alterar essas linhas de caminho absoluto para parentesco como:

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

O que eu fiz escrevendo um script colocado acima de RESULTS folder: (parte do script)

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

onde:

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

MAS aqui está o problema. Quando operando de mais de 81 caminhos de chars , o programa gerará os arquivos .pc no mesmo padrão de estrutura de pastas, mas dentro do arquivo PC , os caminhos absolutos são separados por nova linha por - na posição 81. char:

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

onde:

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

Aqui está o problema. Meu script não vê a variável $SEARCH . O problema ainda maior é que o caminho pode ter mais de 180 caracteres, portanto, haverá um caminho de três linhas com dois - divisores.

Não consigo compreender como escrever um script que funcione com essas multilinhas para que a variável de caminho seja encurtada para ../../SK312_*.inc como antes com um caminho curto de uma linha absoluta.

    
por Son Goku ssj4 19.10.2015 / 19:27

1 resposta

0

Se o seu programa estiver cortando as linhas, você precisará se juntar a eles antes de executar o sed . Por exemplo:

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

Ou

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

Como alternativa, você pode usar find em vez de grep :

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

Todas as abordagens acima recorrerão a subdiretórios.

    
por 19.10.2015 / 22:45