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