web-dev-qa-db-fra.com

capture de groupes dans sed

J'ai plusieurs lignes de la forme

ko04062 ko:CXCR3
ko04062 ko:CX3CR1
ko04062 ko:CCL3
ko04062 ko:CCL5
ko04080 ko:GZMA

et voudrait bien se débarrasser du ko: peu de la colonne de droite. J'essaie d'utiliser sed, comme suit:

echo "ko05414 ko:ITGA4" | sed 's/\(^ko\d{5}\)\tko:\(.*$\)/\1\2/'

qui renvoie simplement la chaîne originale que j'ai répercutée. Je suis très novice en matière de script de ligne de commande, sed, pipes, etc., alors s'il vous plaît, ne soyez pas trop en colère si/quand je fais quelque chose d'extrêmement stupide. 

Ce qui me dérange le plus, c’est que la même chose se produise si j’inverse le bit \1\2 pour lire \2\1 ou n’utilise qu’un seul groupe. Ceci, je suppose, implique que je manque quelque chose à propos de la mécanique de la restitution de l'écho dans sed, ou que mon expression rationnelle est fausse ou que je l'utilise mal ou que sed n'imprime pas les résultats de la substitution .

Toute aide serait grandement appréciée!

23
Mike Dewar

sed émet son entrée car la substitution ne correspond pas. Puisque vous utilisez probablement GNU sed, essayez ceci:

echo "ko05414     ko:ITGA4" | sed 's/\(^ko[0-9]\{5\}\)\tko:\(.*$\)/\1\2/'
  • \ d -> [0-9] puisque GNU sed ne reconnaît pas\d
  • {} ->\{\} puisque GNU sed utilise par défaut des expressions rationnelles de base.
21
ninjalj

Cela devrait le faire. Vous pouvez également ignorer le dernier groupe et simplement utiliser \1, mais puisque vous apprenez sed et regex, vous pouvez en profiter. Je voulais utiliser un groupe sans capture dans le (:? ) du milieu, mais je ne pouvais pas le faire jouer à sed pour une raison quelconque, cela n’est peut-être pas pris en charge.

sed --posix 's/\(^ko[0-9]\{5\}\)\( ko:\)\(.*$\)/\1 \3/g' file > result

Et bien sûr, vous pouvez utiliser

sed --posix 's/ko://'
10
Anders

Vous n'avez pas besoin sed pour cela

Voici comment vous pouvez le faire avec bash:

var="ko05414 ko:ITGA4"
echo ${var//"ko:"}

$ {var // "ko:"} remplace tout "ko:" par ""

Voir Manipuler des cordes pour plus d'informations

6
getekha

@OP, si vous voulez juste vous débarrasser de "ko:", alors

$ cat file
ko04062 ko:CXCR3
ko04062 ko:CX3CR1
ko04062 ko:CCL3
ko04062 ko:CCL5
some text with a legit ko: this ko: will be deleted if you use gsub.
ko04080 ko:GZMA

$ awk '{sub("ko:","",$2)}1' file
ko04062 CXCR3
ko04062 CX3CR1
ko04062 CCL3
ko04062 CCL5
some text with a legit ko: this ko: will be deleted if you use gsub.
ko04080 GZMA

Jsut une note. Bien que vous puissiez utiliser la substitution de chaîne pure bash, elle n’est plus efficace que lorsque vous modifiez une seule chaîne. Si vous avez un fichier, en particulier un gros fichier, l'utilisation de bash pendant la lecture est encore plus lente que d'utiliser sed ou awk.

0
ghostdog74