Como escrevo uma frase de efeito sed para adicionar um caractere após cada terceiro caractere?

10

Então, eu tenho uma string que se parece com isso:

AUGGCCAUGGCGCCCAGAACUGAGAUCAAUAGUACCCGUAUUAACGGGUGA

E eu quero dividir a string em pedaços de 3 caracteres delimitados por um sinal de '+'.

AUG+GCC+AUG+GCG+CCC+AGA+ACU+GAG+AUC+AAU+AGU+ACC+CGU+AUU+AAC+GGG+UGA

E eu quero fazer isso com meu bom amigo sed.

eu tentei

cat codons | sed -r 's/([A-Z]\{3\})/\1\+/g'

... sem sucesso.

Que sedcomando posso usar?

ixtmixilix
fonte
1
Isso não está de alguma forma conectado a Rosalind ? Apenas curioso.
precisa saber é o seguinte

Respostas:

16

Como você não deseja um rastreamento +, você pode fazer:

fold -w3 | paste -sd+ -

Ou seja, foldas linhas do 3caractere width e pasteas três linhas de caracteres com os selfos com +o delimitador que, na verdade, é como alterar todos os caracteres da nova linha, exceto o último em a +. Se a entrada tiver mais de uma linha, você terminará com as linhas unidas a uma +que pode ou não ser o que você deseja.

Se você precisar sed, você pode remover o +seguinte:

sed 's/.../&+/g;s/+$//'
Stéphane Chazelas
fonte
Você se importaria de adicionar uma breve explicação de como isso funciona?
NN
@NN Funciona porque +$corresponde a um símbolo de adição imediatamente antes do final de uma linha.
Chris Baixo
fold -w3quebra a sequência em três linhas de caracteres. paste -sd+ -transforma as novas linhas em +.
bahamat
12
sed 's/.../&+/g'

para dar certo, você não precisa escapar dos {}símbolos:

sed -r 's/([A-Z]{3})/\1+/g'
pressa
fonte
1
quem sabia! Eu estava tão perto e tão longe ... obrigado ...
ixtmixilix
Ambos adicionam um '+' à direita. Isso é pretendido?
NN
2

Isso pode funcionar para você (GNU sed):

sed 's/...\B/&+/g' file
potong
fonte
0

Se o sed não for obrigatório, usar Ruby pode ser uma alternativa. O intérprete Ruby,, rubypode ser usado como sed e awk, executando-o com a -nopção que faz iterar sobre sua entrada. O intérprete pode então ser alimentado com uma linha única do Ruby, adicionando-o como argumento à -eopção (que instrui o intérprete a interpretar o argumento, em -evez de procurar um script em um arquivo).

Para esse problema específico, você pode usar a seguinte linha única (adaptada de /programming//a/3184271/789593 ):

ruby -ne 'puts $_.scan(/.{3}|.+/).join("+")'

Em linguagem simples,

  • corresponde a 3 caracteres ou pelo menos um caractere, scan(/.{3}|.+/)na sequência de entrada $_(nesse caso, espera-se que a entrada seja padrão) e coloca cada correspondência em uma matriz,
  • une a matriz a uma string com um '+' conectando cada elemento join("+"),
  • e imprime terminado por uma nova linha puts.

Por exemplo

echo "AUGGCCAUGGCGCCCAGAACUGAGAUCAAUAGUACCCGUAUUAACGGGUG" | ruby -ne 'puts $_.scan(/.{3}|.+/).join("+")'
AUG+GCC+AUG+GCG+CCC+AGA+ACU+GAG+AUC+AAU+AGU+ACC+CGU+AUU+AAC+GGG+UG

Observe que ele não adiciona nenhum '+' à direita.

NN
fonte