다음과 같은 파일 경로 이름이 있습니다.
/dbfs/mnt/dlg2stage/foldername/backupname/201906_load_1_20210623-151602.tar.tgz
201906
6자리 숫자만 구해서 인쇄하려고 합니다 . 시도했지만 실패 sed
했습니다 awk
.
답변1
이것이 시스템의 실제 파일이라고 가정하면 _
쉘 루프를 사용하여 일치하는 디렉터리에 있는 각 파일의 첫 번째 파일 이름 앞 부분을 쉽게 추출할 수 있습니다.*_*.tar.tgz
/dbfs/mnt/dlg2stage/foldername/backupname
for pathname in /dbfs/mnt/dlg2stage/foldername/backupname/*_*.tar.tgz; do
name=$( basename "$pathname" )
printf '%s\n' "${name%%_*}"
done
이 basename
유틸리티는 경로 이름의 파일 이름 부분을 제공합니다. 보여준 예에서 문자열을 201906_load_1_20210623-151602.tar.tgz
변수에 할당합니다 name
. 를 사용 name=${pathname##*/}
하여 동일한 작업을 수행 할 수도 있습니다 (이 매개변수 확장은 문자열의 초기 부분을 $pathname
마지막 부분까지 제거합니다 /
).
매개변수 확장으로 ${name%%_*}
인해 _*
가장 긴 후행 하위 문자열 일치가 value 에서 제거됩니다 $name
. 표시된 예에서 이는 첫 번째 _
문자와 그 오른쪽에 있는 모든 문자를 제거하고 하위 문자열을 남겨두고 201906
를 사용하여 인쇄할 수 있습니다 printf
.
답변2
그리고 zsh
:
file=/dbfs/mnt/dlg2stage/foldername/backupname/201906_load_1_20210623-151602.tar.tgz
set -o extendedglob # for (#c6)
first_6_digits_of_file_tail=${(M)${file:t}[0-9](#c6)}
${file:t}
필요한 곳꼬리${(M)var#pattern}
일치하는 패턴의 시작 부분을 반환하는 파일 이름(기본 이름)입니다 .$var
M
POSIXly에서는 다음을 사용할 수 있습니다.
first_6_digits_of_file_tail=$(
LC_ALL=C expr "/$file" : '.*/\([0-9]\{6\}\)[^/]*/*$'
)
LC_ALL=C
사용자의 로케일을 무시하고 모든 바이트를 문자로 처리합니다(/ 및 0123456789 숫자를 포함하여 대부분의 시스템에서 ASCII의 비트 128에 따름). 따라서 바이트는 .
일치 하고 0123456789만 포함합니다. 숫자 코드 포인트를 기반으로 한 범위가 아니며 zsh는 유효한 문자의 일부를 형성하지 않는 각 바이트를 마치 문자인 것처럼 처리합니다.[^/]
[0-9]
zsh
접두어를 사용하면 연산자로 시작 하거나 연산자처럼 보이는 값 /
의 문제를 방지하고 문자열에 정규식에서 예상되는 값이 하나 이상 포함되도록 보장합니다.$file
-
expr
/
/
or의 기본 이름이 있는 or를 사용하여 zsh의 솔루션과 동일한 동작을 얻는 것을 제외하고는 마지막 뒤에 s를 허용하지 않습니다./XXXXXX
basename
$file:t
/foo/bar/
/foo/bar////
bar
일치하는 항목이 없고 6자리 시퀀스가 0 숫자를 나타내는 경우(그림 참조 /path/to/000000_whatever
) 거짓/실패 종료 상태를 반환합니다.
답변3
201906
나는 당신이 주어진 경로 문자열을 인쇄하고 싶다고 생각합니다 . 이 예에서 6자리 숫자는 다음과 같습니다.슬래시가 앞에 오는 처음 6자리 숫자.
명령을 더 쉽게 읽을 수 있도록 경로를 변수에 넣었습니다.
% path_str='/dbfs/mnt/dlg2stage/foldername/backupname/201906_load_1_20210623-151602.tar.tgz'
% echo $path_str | sed 's/.*\/\([0-9]\{6\}\).*/\1/'
201906
이것이 내가 경기를 설정하고 교체하는 방법입니다.sed:
\/[0-9]\{6\}
: 슬래시 및 6자리 숫자와 일치\/\([0-9]\{6\}\)
: 동일하지만 이제캡처 그룹또는하위 표현식(슬래시는 캡처 그룹에 없습니다).*\/\([0-9]\{6\}\).*
: 이전과 이후의 모든 항목과 일치하므로...전선\1
: 참조를 사용하여 전체 줄과 일치합니다.첫 번째전체 줄을 처음 6자리 숫자로만 바꾸는 (고유한) 캡처 그룹