用于剪切多个分隔符的 awk/sed 命令

用于剪切多个分隔符的 awk/sed 命令

我输入的文件名如下:

Sample_0000860156-001-out_20150224150524.xml.gz

我只想0000860156-001将 file_name 附加到我的目标文件名。

答案1

这里有一些方法。您还没有解释要如何处理要提取的字符串,所以我将打印它。

  1. awk有多个分隔符

    echo Sample_0000860156-001-out_20150224150524.xml.gz | 
     awk -F '[_-]' '{print $2"-"$3}'
    
  2. GNUgrep

    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. 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]'
    
  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

相关内容