2010-01-06 4 views
1

Je dois inverser toute chaîne de caractères avec 5 caractères consécutifs. Par exemple:Chaîne de retour avec 5 caractères consécutifs

hello hi adams sde 
abcde abs 

sortie requis:

olleh hi smada sde 
edcba abs 

je:

sed -n 's\(a-z]\)\([a-z]\)\([a-z]\)\([a-z]\)\([a-z]\)/\5\4\3\2\1/p' 

Il renverse nécessaire cordes sauf "adams". S'il vous plaît aidez-moi à résoudre ce problème.

+0

Pourquoi voter pour fermer ce? Peut-être pas la question la plus claire que j'ai vu, mais je ne vois pas comment il peut être décrit comme "spam" ... –

Répondre

1

On dirait que ce n'est pas tellement que "adams" n'est pas remplacé, mais que votre commande remplace seulement la première instance correspondante. Essayez ceci:

sed -n 's/\([a-z]\)\([a-z]\)\([a-z]\)\([a-z]\)\([a-z]\)/\5\4\3\2\1/pg' 

A partir du manuel:

The s command can be followed by zero or more of the following flags: 
g Apply the replacement to all matches to the regexp, not just the first. 
(snip) 
+0

vous avez presque raison merci :) sed -n 's/\\ ([ az] \\) \\ ([az] \\) \\ ([az] \\) \\ ([az] \\) \\ ([az] \\)/\ 5 \ 4 \ 3 \ 2 \ 1/pg ' – Leo

+0

Merci - réponse éditée. –

+0

donc si vous avez une chaîne comme "puissant", ce sera "reboot"? – ghostdog74

1

utilisation awk

awk '{ 
    for(i=1;i<=NF;i++) { 
     if(length($i)==5) { 
      v="" 
      for(o=length($i);o>0;o--) { 
       v=v substr($i,o,1) 
      } 
      $i=v 
     } 
    } 
}1' file 

sortie

$ more file 
hello hi adams sde 
abcde abs 
$ ./shell.sh 
olleh hi smada sde 
edcba abs 
Questions connexes