다음 형식의 디렉토리가 있습니다.
/folder1/folder2/name_X_Y_Z_A
여기서 X
는 숫자, Y
, Z
은 A
3개 또는 4개의 문자열입니다.
다음을 수행하기 위해 쉘 스크립트 파일을 작성하고 싶습니다.
- 폴더 이름에서
X
합계를 추출합니다.Z
- 문자열 생성
/folder1/folder2/name_(X-1)_Y_Z_A
string_Z.dat
이 디렉터리에서 파일 복사
여기에서 특정 패턴을 추출하는 방법을 모르겠습니다 $PWD
. 숫자 길이와 길이가 다를 수 있으므로 X
및 의 문자 위치는 동일할 필요가 없습니다.Z
name
답변1
먼저 셸의 매개변수 대체 구문을 사용하여 선행 경로 구성 요소를 잘라낸 ${PWD##*/}
다음 밑줄을 필드 구분 기호로 사용하여 기본 이름을 배열로 읽을 수 있습니다.
IFS=_ read -a arr <<< "${PWD##*/}"
bash 배열은 인덱스가 0이므로 원하는 부분이 위치해야 합니다 ${arr[1]}
.${arr[3]}
newdir="/folder1/folder2/name_$((${arr[1]}-1))_${arr[3]}_Z_A"
(X-1)
[참고: 리터럴 문자열이 아니라 산술 결과를 의미한다고 가정합니다 . ]
답변2
X,Y,Z,A에 밑줄이 없다고 가정하면 매번 꼬리를 "잘라낼" 수 있습니다.
예를 들어
# DIR=$PWD
# example:
DIR=/folder1/folder2/name_100_YYYY_ZZZZ_AAAA
A=${DIR##*_} ; DIR=${DIR%_*}
Z=${DIR##*_} ; DIR=${DIR%_*}
Y=${DIR##*_} ; DIR=${DIR%_*}
X=${DIR##*_} ; DIR=${DIR%_*}
let X=X-1
DIR="${DIR}_${X}_${Y}_${Z}_${A}"
echo $DIR
이를 수행할 수 있는 또 다른 방법은 끝이 어디인지 알아내고 X
나머지 부분을 한 번에 제거하는 것입니다.
# DIR=$PWD
# example:
DIR=/folder1/folder2/name_100_YYYY_ZZZZ_AAAA
DIRX=${DIR%_*_*_*}
YZA=${DIR#$DIRX}
X=${DIRX##*_} ; DIRX=${DIRX%_*}
let X=X-1
DIR="${DIRX}_${X}${YZA}"
echo $DIR
두 경우 모두 /folder1/folder2/name_99_YYYY_ZZZZ_AAAA
결과를 얻습니다. 당신은 쉽게 cp
파일을 넣을 수 있습니다.
답변3
Python을 사용할 수 있는 경우:
$ pwd=/folder1/folder1/name_10_ABCD_ABC_ABCD # or use $PWD
$ new=$(python -c "import os; x='"$pwd"'.rsplit('/', 1)[1].split('_'); x[1]=str(int(x[1])+1); print('_'.join(x))")
$ echo $new
name_11_ABCD_ABC_ABCD