여러 줄 경로를 한 줄 상대 경로로 다시 쓰는 방법

여러 줄 경로를 한 줄 상대 경로로 다시 쓰는 방법

나는 여기저기 찾아다녔어요. 답변을 찾지 못했는데, 기다리겠습니다!

내 작업의 프로그램은 *.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자를 초과할 수 있으므로 두 개의 구분 기호가 있는 세 줄의 경로가 생성된다는 것입니다 -.

../../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" {} +

위의 모든 메서드는 하위 디렉터리로 반복됩니다.

관련 정보