파일 경로 중간에 있는 6자리 숫자를 얻는 방법

파일 경로 중간에 있는 6자리 숫자를 얻는 방법

다음과 같은 파일 경로 이름이 있습니다.

/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}일치하는 패턴의 시작 부분을 반환하는 파일 이름(기본 이름)입니다 .$varM

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를 허용하지 않습니다./XXXXXXbasename$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자리 숫자로만 바꾸는 (고유한) 캡처 그룹

관련 정보