Если первое слово в строке всегда заканчивается на _length
, эта команда sed
должна сделать это:
sed 's/^\(.*_\)length .* transcript_id "/&\1/' test.txt
Выход:
Node_4_length augustus gene 234 1252 g361
Node_4_length augustus gene 1543 2252 . transcript_id "Node_4_g361.t1";
Node_4_length augustus gene 3343 7552 . transcript_id "Node_4_g361.t1";
protein sequence = [MRSVSLFLLGLAPLL]
Node_5_length augustus gene 334 1252 g362
Node_5_length augustus gene 4543 8252 . transcript_id "Node_5_g362.t1";
Node_5_length augustus gene 19343 27552 . transcript_id "Node_5_g362.t1";
protein sequence = [SNLVDWSEPTLTTIEEDTAGMAWA]
Попробуйте, если вы не уверены в суффиксе _length:
sed 's/^\(.\{10\}\).*transcript_id "/&\1/'
Выход:
Node_4_length augustus gene 234 1252 g361
Node_4_length augustus gene 1543 2252 . transcript_id "Node_4_leng361.t1";
Node_4_length augustus gene 3343 7552 . transcript_id "Node_4_leng361.t1";
protein sequence = [MRSVSLFLLGLAPLL]
Node_5_length augustus gene 334 1252 g362
Node_5_length augustus gene 4543 8252 . transcript_id "Node_5_leng362.t1";
Node_5_length augustus gene 19343 27552 . transcript_id "Node_5_leng362.t1";
protein sequence = [SNLVDWSEPTLTTIEEDTAGMAWA]
Объяснение
В обоих случаях вы видите этот шаблон замены:
&\1
&
захватывает весь матч, то есть все от начала строки (^
) до вводной цитаты ("
).
Со второй строкой вашего примера ввода это будет:
Node_4_length augustus gene 1543 2252 . transcript_id "
\1
захватывает первый подшаблон захвата, то есть все между \(
и \)
. В моей первой команде sed это будет:
Node_4_
Это делает полную строку замены:
Node_4_length augustus gene 1543 2252 . transcript_id "Node_4_
Все, что первоначально следовало за открывающей цитатой, не затрагивается, потому что оно не соответствует шаблону.
Это дает полный вывод:
Node_4_length augustus gene 1543 2252 . transcript_id "Node_4_g361.t1";