제가 입력한 파일명은 다음과 같습니다.
Sample_0000860156-001-out_20150224150524.xml.gz
내 대상 파일 이름에 file_name을 추가하고 싶습니다 0000860156-001
.
답변1
다음은 몇 가지 방법입니다. 추출하려는 문자열로 무엇을 해야 하는지 설명하지 않았으므로 그냥 인쇄하겠습니다.
awk
구분 기호가 여러 개 있습니다.echo Sample_0000860156-001-out_20150224150524.xml.gz | awk -F '[_-]' '{print $2"-"$3}'
암소 비슷한 일종의 영양
grep
echo Sample_0000860156-001-out_20150224150524.xml.gz | grep -oP '_\K.*(?=-)'
sed
echo Sample_0000860156-001-out_20150224150524.xml.gz | sed 's/.*_\([0-9]*-[0-9]*\)-.*/\1/'
펄
echo Sample_0000860156-001-out_20150224150524.xml.gz | perl -pe 's/.*_(.+?-.+?)-.*/\1/'
또는 최신 Perl 버전을 사용하세요(감사합니다.@ksenoy):
echo Sample_0000860156-001-out_20150224150524.xml.gz | perl -aF/[_-]/ -lne 'print $F[1]-$F[2]'
cut
echo Sample_0000860156-001-out_20150224150524.xml.gz | cut -d_ -f2 | cut -d- -f1,2
답변2
그러면 디렉토리의 각 *.gz에 대해 새로운 빈 파일이 생성됩니다.예제 패턴 유지:
touch $(ls *.gz | awk -F '_' {'print $2'} | awk -F "-out" {'print $1'})
아니면 제안대로지드:
touch $(ls *.gz | awk -F '_|-out' {'print $2'})
답변3
GNU awk를 사용한 일치
awk 'match($0,/_([0-9]+-[0-9]+)/,a){print "file."a[1]".gz"}' <<< "$FILENAME"
산출
file.0000860156-001.gz