"." 앞이나 확장자 앞의 파일 이름 부분을 추출하는 방법

"." 앞이나 확장자 앞의 파일 이름 부분을 추출하는 방법

다음 형식의 파일이 있습니다.

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

관련 정보