파일이 있습니다 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
_
마지막(포함된) 변수 이후의 모든 항목을 제거한 후 변수 값을 포함하는 매개변수 확장 모드입니다 .