複数の区切り文字を切り捨てるための 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バージョンを使用してください(ありがとう。ツイート):

    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

関連情報