我输入的文件名如下:
Sample_0000860156-001-out_20150224150524.xml.gz
我只想0000860156-001
将 file_name 附加到我的目标文件名。
答案1
这里有一些方法。您还没有解释要如何处理要提取的字符串,所以我将打印它。
awk
有多个分隔符echo Sample_0000860156-001-out_20150224150524.xml.gz | awk -F '[_-]' '{print $2"-"$3}'
GNU
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/'
Perl
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