Как использовать sed и регулярные выражения, чтобы найти шаблон и удалить последние несколько символов?

У меня есть файл GFF, в котором мне нужно удалить -R * из всех строк, которые имеют шаблон Parent = gopAga1 _……..- R .;

Структура файла показана ниже для одного гена, но мне нужно глобальное исправление для всех генов в файле.

>2446 17292 . + . ID=gopAga1_00004497-RA;Parent=gopAga1_00004497;Name=gopAga1_00004497-RA;Alias=augustus_masked-scaffold4362-processed-gene-0.0-mRNA-1;_AED=0.12;_QI=0|0.8|0.81|1|1|1|11|1368|404;_eAED=0.12;Note=Similar to PLAT: Tissue-type plasminogen activator (Pongo abelii); >scaffold4362 maker exon 2446 2545 . + . ID=gopAga1_00004497-RA:exon:4045;Parent=gopAga1_00004497-RA; >scaffold4362 maker exon 6721 6834 . + . ID=gopAga1_00004497-RA:exon:4046;Parent=gopAga1_00004497-RA; >scaffold4362 maker exon 7241 7415 . + . ID=gopAga1_00004497-RA:exon:4047;Parent=gopAga1_00004497-RA; >scaffold4362 maker exon 10114 10205 . + . ID=gopAga1_00004497-RA:exon:4048;Parent=gopAga1_00004497-RA; >scaffold4362 maker exon 10478 10649 . + . ID=gopAga1_00004497-RA:exon:4049;Parent=gopAga1_00004497-RA; >scaffold4362 maker exon 11037 11122 . + . ID=gopAga1_00004497-RA:exon:4050;Parent=gopAga1_00004497-RA; >scaffold4362 maker exon 11518 11713 . + . ID=gopAga1_00004497-RA:exon:4051;Parent=gopAga1_00004497-RA; >scaffold4362 maker exon 12794 12930 . + . ID=gopAga1_00004497-RA:exon:4052;Parent=gopAga1_00004497-RA; >scaffold4362 maker exon 13006 13146 . + . ID=gopAga1_00004497-RA:exon:4053;Parent=gopAga1_00004497-RA; >scaffold4362 maker exon 14920 15047 . + . ID=gopAga1_00004497-RA:exon:4054;Parent=gopAga1_00004497-RA; >scaffold4362 maker exon 16051 17292 . + . ID=gopAga1_00004497-RA:exon:4055;Parent=gopAga1_00004497-RA; 

Я использую sed для поиска шаблонов, но я не уверен, как использовать sed для удаления всего, что находится между последним числом строки и точкой с запятой.

Будет ли работать мой текущий скрипт? Ожидаемый результат ниже.

sed ‘s / Parent = gopAga1 _……..- R.; $ / Parent = gopAga1 ……..; / gop.gff

 >2446 17292 . + . ID=gopAga1_00004497-RA;Parent=gopAga1_00004497;Name=gopAga1_00004497-RA;Alias=augustus_masked-scaffold4362-processed-gene-0.0-mRNA-1;_AED=0.12;_QI=0|0.8|0.81|1|1|1|11|1368|404;_eAED=0.12;Note=Similar to PLAT: Tissue-type plasminogen activator (Pongo abelii); >scaffold4362 maker exon 2446 2545 . + . ID=gopAga1_00004497-RA:exon:4045;Parent=gopAga1_00004497; >scaffold4362 maker exon 6721 6834 . + . ID=gopAga1_00004497-RA:exon:4046;Parent=gopAga1_00004497; >scaffold4362 maker exon 7241 7415 . + . ID=gopAga1_00004497-RA:exon:4047;Parent=gopAga1_00004497; >scaffold4362 maker exon 10114 10205 . + . ID=gopAga1_00004497-RA:exon:4048;Parent=gopAga1_00004497; >scaffold4362 maker exon 10478 10649 . + . ID=gopAga1_00004497-RA:exon:4049;Parent=gopAga1_00004497; >scaffold4362 maker exon 11037 11122 . + . ID=gopAga1_00004497-RA:exon:4050;Parent=gopAga1_00004497; >scaffold4362 maker exon 11518 11713 . + . ID=gopAga1_00004497-RA:exon:4051;Parent=gopAga1_00004497; >scaffold4362 maker exon 12794 12930 . + . ID=gopAga1_00004497-RA:exon:4052;Parent=gopAga1_00004497; >scaffold4362 maker exon 13006 13146 . + . ID=gopAga1_00004497-RA:exon:4053;Parent=gopAga1_00004497; >scaffold4362 maker exon 14920 15047 . + . ID=gopAga1_00004497-RA:exon:4054;Parent=gopAga1_00004497; >scaffold4362 maker exon 16051 17292 . + . ID=gopAga1_00004497-RA:exon:4055;Parent=gopAga1_00004497; 

Может быть:

 sed 's/-R[^;]*;$/;/' 

Или же

 awk -F ';' -f OFS=';' '{sub(/-R.*/, "",$(NF-1))}; 1' 
 $ sed '/^>.*Parent=samp1_/s/-R.;$/;/' ID=samp1_00004497:4045;Parent=samp1_00004497; >ID=samp1_00004497:4046;Parent=samp1_00004498; >ID=samp1_00004497:4047;Parent=samp1_00004499; >ID=samp1_00004497:4048;Parent=samp1_00004496; 

Приведенная выше команда sed найдет все строки, начинающиеся с > и содержащие строку Parent=samp1_ , и для каждой такой строки замените последнюю -R.; (где . соответствует одному символу) просто ; , Строки не заканчиваются ничем, совпадающими с -R.; останется неизменным.

Измените точку в -R.; на [^;]* если вы хотите удалить любое число не ; характер до ; в конце.

Для вашего обновленного вопроса используйте Parent=gopAga1_ вместо Parent=samp1_ .

Командная строка

 sed -re 's/([^-]+).+?;/\1;/g' 

выведет все до - для каждой строки, не включая - и затем добавит точку с запятой в конец.

Обновить

 sed -re 's/(_.{8})-R./\1/g' 

удалит нежелательные символы на основании наличия _ затем 8 символов, а затем -R .