2017-08-29 7 views
0

J'utilise cette commande sed pour remplacer la chaîne "##INFO=<ID=" avec "\t%":Comment échapper backslash avec la commande sed lorsque le caractère suivant est « t »

bcftools view -h /data/ExAC.r1.sites.vep.vcf | grep "^##INFO=<ID=" | sed $'/^##INFO=<ID=/{ s//'\t%INFO' /; s/,.*//; p; }'' mais ce que je reçois est exactement ma sortie désirée, mais au lieu d'un antislash, il n'imprime rien. Si je supprime les guillemets simples autour de \t%INFO dans la commande sed, il tabule automatiquement la sortie, donc je ne le veux pas non plus. Comment puis-je échapper le backslash afin qu'il imprime juste un backslash?

Merci.

+0

Avez-vous essayé '\\ t'? –

+0

oui, cela n'a pas fonctionné – TheBral

Répondre

1
sed $'/^##INFO=<ID=/{ s//'\t%INFO' /; s/,.*//; p; }'' 

1.) Le signe du dollar face ne semble pas avoir un point

sed '/^##INFO=<ID=/{ s//'\t%INFO' /; s/,.*//; p; }'' 

2.) Tu ne peux pas simplement nid guillemets simples. Je ne sais pas comment cela "fonctionne" je ne m'y attendrais pas.

sed '/^##INFO=<ID=/{ s//\t%INFO /; s/,.*//; p; }' 

3.) Cela remplace la chaîne avec un onglet puis un% INFO. Puis l'imprime. échapper une fois.

sed '/^##INFO=<ID=/{ s//\\t%INFO /; s/,.*//; p; }' 

4.) Cela remplace le stinge avec \ t% INFO imprime ensuite, ce qui dans l'onglet% INFO. Échapper à nouveau.

sed '/^##INFO=<ID=/{ s//\\\\t%INFO /; s/,.*//; p; }' 

5.) Cela devrait fonctionner.

Mais il y a une réponse plus facile en utilisant un groupe de capture. On dirait que vous cherchez cela?

bcftools view -h /data/ExAC.r1.sites.vep.vcf \ 
| grep "^##INFO=<ID=" \ 
| sed -E 's/^##INFO=<ID=([^,]*),.*/\\t%INFO \1/' 

Pour obtenir tous sur la ligne:

bcftools view -h /data/ExAC.r1.sites.vep.vcf \ 
| grep "^##INFO=<ID=" \ 
| sed -E 's/^##INFO=<ID=([^,]*),.*/\\t%INFO \1/' \ 
| awk '{printf "%s ", $0}' 
+0

Merci qui a fonctionné. Maintenant, la sortie est plusieurs lignes, mais comment puis-je obtenir tout cela sur une ligne? – TheBral

0

Référence Bash Quoting

'chaîne' $ est appelée citant interprète séquence backslash ANSI C, il suffit d'utiliser les guillemets simples citant pour éviter d'interpréter des personnages les l'inconvénient est qu'il ne peut pas contenir de guillemets simples, mais une chaîne différente peut être concaténée.