파일명에서 5번째 _ 앞 부분을 추출하고 싶으신가요?

파일명에서 5번째 _ 앞 부분을 추출하고 싶으신가요?

파일이 있습니다 abc_asdfjhdsf_ckd_dfksfj_c_12345678_223344.txt. 출력이 되기를 원합니다 abc_asdfjhdsf_ckd_dfksfj_c.txt.

답변1

sed 사용

$ echo abc_* | sed -E 's/(([^_]*_){5}).*/\1/; s/_$/.txt/'
abc_asdfjhdsf_ckd_dfksfj_c.txt

작동 방식:

  • s/(([^_]*_){5}).*/\1/

    그러면 그룹 1(최대 5번째)의 파일 이름 시작 부분이 캡처되고 _나머지는 제거됩니다.

    더 자세히 살펴보면 sed의 대체 명령은 다음과 같은 형식을 갖습니다. 정규식은 s/old/new/어디에 있습니까? old이 예에서 정규식은 ([^_]*_){5}처음 5개 부분과 일치합니다. 이 정규식을 괄호 안에 넣어 처음 5개 부분이 그룹 1에 저장되도록 합니다 . (([^_]*_){5})이를 . 처음 5개 그룹 이후의 모든 항목과 일치합니다. 우리는 이들 모두를 처음 5개 그룹인 .\1.*\1

  • s/_$/.txt/

    그러면 마지막 남은 것을 _찾아서 .txt.

awk를 사용하세요

$ echo abc_* | awk -F_ '{print $1,$2,$3,$4,$5 ".txt"}' OFS=_
abc_asdfjhdsf_ckd_dfksfj_c.txt

_이는 입력 및 출력 필드 구분자 로 사용됩니다 . 따라서 처음 5개 필드를 인쇄하고 그 뒤에 .txt.

대안: 마지막 두 부분을 제거하십시오.

위의 코드는 처음 5개 부분을 유지하고 나머지 부분을 삭제합니다. 질문의 예에는 7개의 섹션이 있으며 어느 것도 마침표를 포함하지 않습니다. 항상 그랬다면, 또 다른 접근 방식(팁: Costas)은 마지막 두 부분을 제거하는 것입니다.

$ echo abc_* | sed -E 's/(_[^_]*){2}\././'
abc_asdfjhdsf_ckd_dfksfj_c.txt

답변2

파일 끝의 이름을 바꾸려는 원래 질문을 참조하면 다음과 같습니다.

ls abc*
abc_asdfjhdsf_ckd_dfksfj_c_12345678_223344.csv

ls abc* | cut -d_ -f1-5 | awk '{print $1".txt";}'
abc_asdfjhdsf_ckd_dfksfj_c.txt

답변3

for   f in ./*_*_*_*_*_?*.txt
do    [ -e "$f" ] &&
      printf %s.txt\\n "${f%"${f#*_*_*_*_*_?}"}"
done

답변4

사용bash 매개변수 확장:

for f in abc_*; do f="${f%_*}"; echo "${f%_*}.txt"; done

산출:

abc_asdfjhdsf_ckd_dfksfj_c.txt

${f%_*}f_마지막(포함된) 변수 이후의 모든 항목을 제거한 후 변수 값을 포함하는 매개변수 확장 모드입니다 .

관련 정보