В Bash _
— это специальный параметр, который устанавливается равным значению последнего аргумента каждый раз при разборе команды. Он также имеет специальное свойство не экспортироваться, которое применяется каждый раз, когда выполняется команда (, см.bind_lastarg
в исходном коде Bash ).
Когда вы запускаете Bash с помощью bash --norc
, вы попадаете в подсказку, не выполнив ни одной команды; поэтому _
, если он присутствовал в среде, не был перезаписан. Когда вы запускаете Bash из Bash, родительский Bash устанавливает _
для команды, выполняемой в дочерней среде перед ее запуском; как и любая другая переменная, присутствующая в среде при запуске, _
становится экспортируемой переменной, и, поскольку никакая команда не была запущена, эта переменная не была «неэкспортирована». Это объясняет, почему ваш первый export
содержит его.
Как только вы запускаете команду (, ваша первая export
в этом случае ), _
перезаписывается и теряет флаг экспорта. Это объясняет, почему ваш второй export
не показывает его.
(Внутри _
такая же переменная, как и любая другая; так что его можно установить только для чтения -или пометить как целое, с забавными результатами.)
Все, что вам нужно, это:
$ 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
Это не awk, но разве sed -e 's,^LTR_retrotransposon100_,LTR/,'
не должно работать?
Решение с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)