다음 형식의 파일이 있습니다.
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