我有一条线:
<random junk>TYPE=snp;<more random junk>
我需要返回结尾TYPE=
和之间的所有内容;
(在这种情况下snp
,但它可以是许多文本字符串中的任何一个。
我尝试了各种 sed / awk 解决方案,但似乎无法正常工作。我觉得这是一个简单的问题,所以很抱歉。
这似乎有效:
sed 's/.*TYPE=\(.*\);.*/\1/'
编辑:
啊,所以随机垃圾中可以有分号。试试这个:
sed 's/.*TYPE=\([^;]*\);.*/\1/'
需要 GNU grep:
grep -Po '(?<=TYPE=)[^;]+'
含义:以“TYPE=”开头,查找一些非分号字符
一种使用方式GNU sed
:
sed -r 's/.*TYPE=([^;]+).*/\1/' file.txt
由于您还标记了此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
如果需要,您也可以在纯 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