Для данного ввода, как указано, это sed
выражение, кажется, делает то, что вы просите:
$ cat input
`>TRINITY_DN75270_c3_g2::TRINITY_DN75270_c3_g2_i4::g.22702::m.22702 [sample]`
$ sed 's/^.*::\([A-Z_0-9a-z]*\)::.*\[\(.*\)\].*/\1[\2]/' input
TRINITY_DN75270_c3_g2_i4[sample]
Магия заключается в использовании групп регулярных выражений и двух обратных ссылок для восстановления желаемого результата. разъяснить:
NODE EXPLANATION
--------------------------------------------------------------------------------
^ the beginning of the string
.* any character except \n (0 or more times
(matching the most amount possible))
:: '::'
\( group and capture to \1:
[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 \1
:: '::'
.* any character except \n (0 or more times
(matching the most amount possible))
\[ '['
( group and capture to \2:
.* any character except \n (0 or more times
(matching the most amount possible))
) end of \2
\] ']'
.* any character except \n (0 or more times
(matching the most amount possible))
Итак, \1
— это первый ключ, который вы хотели извлечь, а \2
— это то, что будет в квадратных скобках после него. Затем Is реконструируется с помощью \1[\2]/
, создавая желаемый результат.