Удалить и заменить все последовательности заголовков

В Bash _— это специальный параметр, который устанавливается равным значению последнего аргумента каждый раз при разборе команды. Он также имеет специальное свойство не экспортироваться, которое применяется каждый раз, когда выполняется команда (, см.bind_lastargв исходном коде Bash ).

Когда вы запускаете Bash с помощью bash --norc, вы попадаете в подсказку, не выполнив ни одной команды; поэтому _, если он присутствовал в среде, не был перезаписан. Когда вы запускаете Bash из Bash, родительский Bash устанавливает _для команды, выполняемой в дочерней среде перед ее запуском; как и любая другая переменная, присутствующая в среде при запуске, _становится экспортируемой переменной, и, поскольку никакая команда не была запущена, эта переменная не была «неэкспортирована». Это объясняет, почему ваш первый exportсодержит его.

Как только вы запускаете команду (, ваша первая exportв этом случае ), _перезаписывается и теряет флаг экспорта. Это объясняет, почему ваш второй exportне показывает его.

(Внутри _такая же переменная, как и любая другая; так что его можно установить только для чтения -или пометить как целое, с забавными результатами.)

-2
16.02.2020, 17:11
3 ответа

Все, что вам нужно, это:

$ sed 's:_.*_:/:' file
>LTR/Gypsy?
cgtgcaccccaatgttcatagcagcactatttacaatagccaagacatggaaacaaccta aatgtcctttgacaggtgactggataaagaagctgtggtatatttatacaatggaatgct actcagccataaaaaagaataagataatgccatttacagcaacatggatagacctggaga atgttattctaagtgaagtaagccagaaagaaaaagaaaaataccatatgctatcactta

>LTR/ERVL-MaLR
taatttgaaaagatacatgcaacccaatgttcatagcagcattatttacaattgccaaga tatggaagcaatctaagtgtccatcaacagatgaatggagagagaagatgtggtatatat acaataaaatactattctgtcataaaaatgaataaaattctgccatttgcaacaacatgg atagacctggagggtattatgctatgtgaaataagtcagacagagaaagacatatactat

или, если вы предпочитаете awk:

$ awk '{sub(/_.*_/,"/")}1' file
>LTR/Gypsy?
cgtgcaccccaatgttcatagcagcactatttacaatagccaagacatggaaacaaccta aatgtcctttgacaggtgactggataaagaagctgtggtatatttatacaatggaatgct actcagccataaaaaagaataagataatgccatttacagcaacatggatagacctggaga atgttattctaagtgaagtaagccagaaagaaaaagaaaaataccatatgctatcactta

>LTR/ERVL-MaLR
taatttgaaaagatacatgcaacccaatgttcatagcagcattatttacaattgccaaga tatggaagcaatctaagtgtccatcaacagatgaatggagagagaagatgtggtatatat acaataaaatactattctgtcataaaaatgaataaaattctgccatttgcaacaacatgg atagacctggagggtattatgctatgtgaaataagtcagacagagaaagacatatactat
1
28.04.2021, 23:23

Это не awk, но разве sed -e 's,^LTR_retrotransposon100_,LTR/,'не должно работать?

0
28.04.2021, 23:23

Решение сsed:

sed -e 's:_retrotransposon10011_:/:g ; s:_retrotransposon100_:/:g' < input > output

Испытания:

$ cat input
LTR_retrotransposon100_Gypsy?
cgtgcaccccaatgttcatagcagcactatttacaatagccaagacatggaaacaaccta aatgtcctttgacaggtgactggataaagaagctgtggtatatttatacaatggaatgct actcagccataaaaaagaataagataatgccatttacagcaacatggatagacctggaga atgttattctaagtgaagtaagccagaaagaaaaagaaaaataccatatgctatcactta

LTR_retrotransposon10011_ERVL-MaLR
taatttgaaaagatacatgcaacccaatgttcatagcagcattatttacaattgccaaga tatggaagcaatctaagtgtccatcaacagatgaatggagagagaagatgtggtatatat acaataaaatactattctgtcataaaaatgaataaaattctgccatttgcaacaacatgg atagacctggagggtattatgctatgtgaaataagtcagacagagaaagacatatactat

$ sed -e 's:_retrotransposon10011_:/:g ; s:_retrotransposon100_:/:g' < input
LTR/Gypsy?
cgtgcaccccaatgttcatagcagcactatttacaatagccaagacatggaaacaaccta aatgtcctttgacaggtgactggataaagaagctgtggtatatttatacaatggaatgct actcagccataaaaaagaataagataatgccatttacagcaacatggatagacctggaga atgttattctaagtgaagtaagccagaaagaaaaagaaaaataccatatgctatcactta

LTR/ERVL-MaLR
taatttgaaaagatacatgcaacccaatgttcatagcagcattatttacaattgccaaga tatggaagcaatctaagtgtccatcaacagatgaatggagagagaagatgtggtatatat acaataaaatactattctgtcataaaaatgaataaaattctgccatttgcaacaacatgg atagacctggagggtattatgctatgtgaaataagtcagacagagaaagacatatactat

Если во входном файле строки между двумя символами подчеркивания(_)могут иметь переменное количество символов, следующий sed с регулярным выражением может решить проблему:

sed -e 's:^\(.*\)_.*_\(.*\)$:\1/\2:' < input > output

Пояснение:

  • круглые скобки в первой части определяют группы (фактически строки )которые можно повторно использовать во второй части
  • \1, \2и т. д. во второй части являются ссылками на i --ю группу, захваченную в первой части (нумерация начинается с 1)
1
28.04.2021, 23:23

Теги

Похожие вопросы