'.' 앞에 파일 이름의 일부를 추출하는 방법 아니면 연장전

'.' 앞에 파일 이름의 일부를 추출하는 방법 아니면 연장전

아래 형식의 파일이 있습니다.

abc_asdfjhdsf_dfksfj_12345678.csv
hjjhk_hkjh_asd_asd_sd_98765498.csv
hgh_nn_25342134.exe

.마지막 이전과 이후의 값을 얻고 싶습니다 _.

결과는 다음과 같습니다:

abc_asdfjhdsf_dfksfj_12345678.csv   ----> 12345678
hjjhk_hkjh_asd_asd_sd_98765498.csv  ----> 98765498
hgh_nn_25342134.exe                 ----> 25342134

답변1

awk를 사용할 수도 있습니다.

$ echo "abc_asdfjhdsf_dfksfj_12345678.csv" | awk -F'[_.]' '{print $4}'
12345678

필드 구분자를 _또는 으로 설정합니다 .. 그런 다음 열 번호 4를 인쇄하면 원하는 결과를 얻을 수 있습니다( $(NF-1)대신 (끝 필드)를 선호할 수도 있습니다 $4).

답변2

POSIX 쉘 변수에 파일 이름이 있는 경우:

file=abc_asdfjhdsf_dfksfj_12345678.csv
n=${file%.*}   # n becomes abc_asdfjhdsf_dfksfj_12345678
n=${file##*_}  # n becomes 12345678.csv

설명으로:

  • ${variable%pattern}$variable, 마이너스 같다가장 짧은일치하는 패턴백엔드;
  • ${variable##pattern}$variable, 마이너스가장 긴일치하는 패턴프런트엔드.

보다이와 같은 참조매개변수 확장에 대한 자세한 내용은

파일 이름 목록이 한 줄에 하나의 파일 이름이 있는 텍스트 스트림에 있는 경우:

sed -n 's/.*_\(.*\)\..*/\1/p'

답변3

GNU를 사용할 수 있습니다 grep.

$ echo abc_asdfjhdsf_dfksfj_12345678.csv | grep -oP '(?<=_)\d+(?=\.)'
12345678

설명

  • (?<=)lookbehind이며 패턴 앞의 (?<=_)밑줄과 일치합니다 _.
  • \d+하나 이상의 숫자와 일치합니다.
  • (?=)예측은 패턴 다음에 (?=\.)점과 일치합니다 ..

전체 정규식은 다음 사이의 모든 항목과 일치함을 의미합니다 _..

답변4

awk를 사용하여 동일한 것을 얻을 수 있습니다

awk -F"." '{print $1}' | awk -F"_" '{print $NF}'

당신의 예에서

echo "abc_asdfjhdsf_dfksfj_12345678.csv" | awk -F"." '{print $1}' | awk -F"_" '{print $NF}'
12345678

echo "hjjhk_hkjh_asd_asd_sd_98765498.csv" | awk -F"." '{print $1}' | awk -F"_" '{print $NF}'
98765498

echo "hgh_nn_25342134.exe" | awk -F"." '{print $1}' | awk -F"_" '{print $NF}'
25342134

관련 정보