1

我有一条线:

<random junk>TYPE=snp;<more random junk>

我需要返回结尾TYPE=和之间的所有内容;(在这种情况下snp,但它可以是许多文本字符串中的任何一个。

我尝试了各种 sed / awk 解决方案,但似乎无法正常工作。我觉得这是一个简单的问题,所以很抱歉。

4

5 回答 5

4

这似乎有效:

sed 's/.*TYPE=\(.*\);.*/\1/'

编辑:

啊,所以随机垃圾中可以有分号。试试这个:

sed 's/.*TYPE=\([^;]*\);.*/\1/'
于 2012-09-20T23:31:53.390 回答
4

需要 GNU grep:

grep -Po '(?<=TYPE=)[^;]+'

含义:以“TYPE=”开头,查找一些非分号字符

于 2012-09-21T00:05:10.520 回答
3

一种使用方式GNU sed

sed -r 's/.*TYPE=([^;]+).*/\1/' file.txt
于 2012-09-20T23:30:54.513 回答
2

由于您还标记了此awk

$ text='<random junk>TYPE=snp;<more random junk>'
$ echo "$text" | awk -FTYPE= '{sub(/;.*/,"",$2); print $2}'
snp
$ text='foo=bar;baz=fnu;TYPE=snp;XAI=0;XAM=0'
$ echo "$text" | awk -FTYPE= '{sub(/;.*/,"",$2); print $2}'
snp

(仅使用变量来防止换行。)

或者,将其解析为一组variable=value对,而不仅仅是一串文本:

$ echo "$text" | awk -vRS=";" -F= '$1=="TYPE" {print $2}'
snp
于 2012-09-22T12:14:32.480 回答
0

如果需要,您也可以在纯 bash 中执行此操作:

$ t="red=blue;TYPE=snp;XAI=0.0037843;XAM=0.0170293;XAS=0.013245;XRI=0;XRM=0"
$ t=${t#*TYPE=}
$ t=${t%%;*}
$ echo $t
snp
于 2012-09-22T12:40:38.697 回答