Para uma determinada entrada, conforme fornecido, essa expressão sed
parece fazer o que você pergunta:
$ cat input
'>TRINITY_DN75270_c3_g2::TRINITY_DN75270_c3_g2_i4::g.22702::m.22702 [sample]'
$ sed 's/^.*::\([A-Z_0-9a-z]*\)::.*\[\(.*\)\].*/[]/' input
TRINITY_DN75270_c3_g2_i4[sample]
A mágica está em usar grupos de expressões regulares e duas referências anteriores para reconstruir a saída desejada. Para expor:
NODE EXPLANATION
--------------------------------------------------------------------------------
^ the beginning of the string
.* any character except \n (0 or more times
(matching the most amount possible))
:: '::'
\( group and capture to :
[A-Z_0-9a-z]* any character of: 'A' to 'Z', '_', '0'
to '9', 'a' to 'z' (0 or more times
(matching the most amount possible))
\) end of
:: '::'
.* any character except \n (0 or more times
(matching the most amount possible))
\[ '['
( group and capture to :
.* any character except \n (0 or more times
(matching the most amount possible))
) end of
\] ']'
.* any character except \n (0 or more times
(matching the most amount possible))
Portanto, é a primeira chave que você deseja extrair e
é o que estiver nas chaves quadradas depois disso. Is é então reconstruído por
[]/
, criando o resultado desejado.