私が入力したファイル名は次のとおりです。
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バージョンを使用してください(ありがとう。ツイート):
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