首页 > 解决方案 > 之后抓取一个单词和可变数量的字符

问题描述

我有一个TAB包含长字符串的单独文件,我打算将8th column其随机过滤包含字母和字符的混合文件,以仅包含“ ;OCCURRENCE=some words|”部分,如下所示:

输入.txt

1 138440 CAMEL C T . . MANY-WORDS-AND-CHARACTERS(*/-;|\);OCCURRENCE=HOY-BR|MANY-WORDS-AnD-CHARACTeRS(;*/-|\)
1 138440 CAT CD TGGD . . MANY-WORDS-AND-CHARACTERS(;*/-|\);OCCURRENCE=DISC-BF5R|MANY-WORDS-AnD-CHARACTeRS(*/-|\;)

预期输出.txt:

1 138440 CAMEL C T . . ;OCCURRENCE=HOY-BR|
1 138440 CAT CD TGGD . . ;OCCURRENCE=DISC-BF5R|

我试图“清理”直到带有字符串8th column的半列出现,但它会擦除其他列,所以它不起作用。OCCURsed 's/.*;OCCUR//g'

如何;OCCURANCE=whatever-word|在不擦除其他列的情况下将模式保留在第 8 列?

标签: regexstringtextawksed

解决方案


对于 GNU sed,确切地说:

$ sed -E 's/((\S+\s){7}).*(\;OCCURRENCE=[^\|]*\|).*/\1\3/' input.txt
1 138440 CAMEL C T . . ;OCCURRENCE=HOY-BR|
1 138440 CAT CD TGGD . . ;OCCURRENCE=DISC-BF5R|

因此,无论是TAB空格分隔还是空格分隔,都请根据您的描述过滤第 8 列。

\S表示非空白字符。
\s表示空白字符。
+表示字符/组出现一次或多次。
{7}表示角色/组出现 7 次。
[^\|]表示任何不是|.
\num表示num捕获()的内容。

检查正则表达式以获取更多信息。


推荐阅读