sed / awk:匹配模式并返回模式结尾和分号之间的所有内容

时间:2012-09-20 23:28:36

标签: sed awk gawk

我有一句话:

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

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

我尝试了各种sed / awk解决方案,但我似乎无法让它工作。我觉得这是一个简单的问题所以,对不起。

5 个答案:

答案 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