我有一句话:
<random junk>TYPE=snp;<more random junk>
我需要在TYPE=
和;
的末尾之间返回所有内容(在这种情况下为snp
,但它可以是多个文本字符串中的任意一个。
我尝试了各种sed / awk解决方案,但我似乎无法让它工作。我觉得这是一个简单的问题所以,对不起。
答案 0 :(得分:4)
这似乎有效:
sed 's/.*TYPE=\(.*\);.*/\1/'
修改
啊,所以随机垃圾中可能有分号。试试这个:
sed 's/.*TYPE=\([^;]*\);.*/\1/'
答案 1 :(得分:4)
需要GNU grep:
grep -Po '(?<=TYPE=)[^;]+'
含义:以&#34; TYPE =&#34;开头,找到一些非分号字符
答案 2 :(得分:3)
使用GNU sed
的一种方式:
sed -r 's/.*TYPE=([^;]+).*/\1/' file.txt
答案 3 :(得分: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
答案 4 :(得分: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