
다음과 같은 파일 경로 이름이 있습니다.
/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%%_*}
인해 일치하는 가장 긴 후행 하위 문자열이 _*
값에서 제거됩니다 $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만 포함합니다. 범위가 기반으로 하는 [0-9]
숫자는 아닙니다. zsh
codepoints 및 zsh는 각 바이트가 유효한 문자의 일부를 형성하지 않는 것을 마치 문자인 것처럼 간주합니다.
연산자 로 시작 하거나 연산자처럼 보이는 /
값에 대한 문제를 방지하고 문자열에 정규식에서 예상 한 대로 하나 이상이 포함되도록 보장하기 위해 앞에 추가합니다 .$file
-
expr
/
우리는 or 의 기본 이름이 있는 or zsh를 사용하는 솔루션과 동일한 동작을 얻기 위해 맨 끝 부분의 제외 /
뒤에 s를 허용하지 않습니다 ./XXXXXX
basename
$file:t
/foo/bar/
/foo/bar////
bar
일치하는 항목이 없지만 해당 6자리 숫자 시퀀스가 0 숫자를 나타내는 경우( 에서와 같이 /path/to/000000_whatever
) false/실패 종료 상태를 반환한다는 점에 주의하세요.
답변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자리 숫자로 바꾸는 캡처 그룹