Esqueça o que eu escrevi antes, pensei que você estivesse movendo arquivos. Acho que entendo melhor agora:
sed -r '/isoforms/{\
N;N;s/(.*Name=)[^;]*(.*Name=)\S*\
(.*Name=.*Target=)(\S*)(.*)/\
/}'
Eu corri e funciona para eu substituir as duas primeiras ocorrências de " Nome = código [0-9 _] * " em qualquer conjunto de três linhas começando com uma contendo " isoformas "com a próxima seqüência não whitespace $ VALUE do par de chaves" Target = $ VALUE ".
Eu usei apenas uma amostra de 20 ou mais linhas; então provavelmente precisa de afinação. Além disso, não tenho certeza se entendi o problema do sufixo ". [A | b] " que você mencionou, embora eu tenha certeza de que não o resolvi ainda. Estou bastante confiante de que, seja o que for, pode ser tratado com um teste de ramo ou dois. Vou tentar explicar o que o código significa:
-
/ isoforms / sed primeiro observa o fluxo de qualquer linha que contenha essa string.
-
{ Quando encontrado, começa a executar o bloco de código localizado dentro das chaves. }
-
N; N; sed lê imediatamente as próximas duas linhas de entrada em seu espaço de padrão para que ele possa operar em três linhas de uma só vez. Se você usou um comando "l" neste ponto para imprimir o espaço do padrão, você verá algo como:
linha de isoformas \ n linha de gene \ n linha de segmentação
-
s / search / replace / o comando s instrui o sed a executar uma função de pesquisa e substituição no espaço de padrão atual.
-
(regex) cada par de parentes no campo de pesquisa de expressão regular corresponde a uma referência anterior no campo de substituição. Algumas taquigrafia eu usei:
-
\ NUM sed incrementa os backreferences de substituição na ordem em que são definidos no campo de pesquisa. Um breve resumo desta pesquisa específica:
-
\ 1 sed procura a string " Name = " e, encontrando três no espaço padrão e três especificados na expressão regular, corresponde a tudo até e incluindo seu primeiro resultado.
-
DESCARREGADO sed descarta a sequência de caracteres mais longa que pode ser encontrada após \ 1 sem incluir um ponto e vírgula.
-
\ 2 Assim como \ 1 , mas para o segundo resultado " Name = ".
-
DESCARTADO sed descarta a próxima sequência de caracteres até encontrar espaço em branco.
-
\ 3 sed corresponde a " Nome = " e tudo o mais até e incluindo " Target = "
-
\ 4 sed corresponde à próxima sequência de caracteres até encontrar espaço em branco
-
\ 5 sed corresponde ao que resta da linha 3
-
Para juntar tudo, eu acabei de substituir as seções DESCARTADO por \ 4 assim:
\ 1 \ 4 \ 2 \ 4 \ 3 \ 4 \ 5
ENTRADA:
ID=gene09491;Name=code_229633_138;isoforms=1
ID=mRNA10690;Parent=gene09491;Name=code_229633_138
ID=exon26252;Parent=mRNA10690;Name=code_229633_138;Target=R77_09738T0
1 411 +
ID=gene09513;Name=code_230519_10;isoforms=1
ID=mRNA10715;Parent=gene09513;Name=code_230519_10
ID=exon26311;Parent=mRNA10715;Name=code_230519_10;Target=R77_04813T0
1 59 +
ID=exon26312;Parent=mRNA10715;Name=code_230519_10;Target=R77_04813T0 60 186 +
OUTPUT:
ID=gene09491;Name=R77_09738T0;isoforms=1
ID=mRNA10690;Parent=gene09491;Name=R77_09738T0
ID=exon26252;Parent=mRNA10690;Name=code_229633_138;Target=R77_09738T0 1 411 +
ID=gene09513;Name=R77_04813T0;isoforms=1
ID=mRNA10715;Parent=gene09513;Name=R77_04813T0
ID=exon26311;Parent=mRNA10715;Name=code_230519_10;Target=R77_04813T0
1 59 +
ID=exon26312;Parent=mRNA10715;Name=code_230519_10;Target=R77_04813T0
60 186 +