여러 구분 기호를 자르기 위한 awk/sed 명령

여러 구분 기호를 자르기 위한 awk/sed 명령

제가 입력한 파일명은 다음과 같습니다.

Sample_0000860156-001-out_20150224150524.xml.gz

내 대상 파일 이름에 file_name을 추가하고 싶습니다 0000860156-001.

답변1

다음은 몇 가지 방법입니다. 추출하려는 문자열로 무엇을 해야 하는지 설명하지 않았으므로 그냥 인쇄하겠습니다.

  1. awk구분 기호가 여러 개 있습니다.

    echo Sample_0000860156-001-out_20150224150524.xml.gz | 
     awk -F '[_-]' '{print $2"-"$3}'
    
  2. 암소 비슷한 일종의 영양grep

    echo Sample_0000860156-001-out_20150224150524.xml.gz | grep -oP '_\K.*(?=-)'
    
  3. sed

    echo Sample_0000860156-001-out_20150224150524.xml.gz | 
      sed 's/.*_\([0-9]*-[0-9]*\)-.*/\1/'
    
  4. 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]'
    
  5. 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

관련 정보