0
votes

Comment retourner le dernier caractère d'une chaîne

J'essaie de retourner le dernier caractère de la chaîne entre 1 et 2. J'ai besoin de comprendre pourquoi System2 est capable de convertir en System1 , cependant System1 n'est pas capable de convertir en System2 ? XXX

Aussi, y a-t-il une manière plus intelligente de faire ce retour?

awk

2 commentaires

Pourquoi auriez-vous besoin awk pour cela? Les coquillages intégrés peuvent être utilisés très bien pour cela


Vous avez beaucoup de réponses AWK qui s'appuient sur la réglage FS sur NULL divisent l'entrée en caractères. C'est un comportement indéfini par POSIX et cela fera donc cela dans certains Awks tandis que dans d'autres Awks, cela laissera l'entrée comme une seule ligne dans 1 champ et dans d'autres Awks, il pourrait encore faire autre chose et toujours être conforme à Posix.


4 Réponses :


1
votes

C'est parce que vous modifiez la NF $ en 2 qui rend la deuxième condition vraie et elle est de nouveau remplie à 1. Vous avez besoin d'un sinon code>. xxx pré>

Je peux penser à une solution de peu plus simple dans SED: p> xxx pré>

lequel Utilise la commande t code> que (si aucune étiquette n'a été spécifiée) passe à la fin du script si la substitution précédente a réussi. p>

Une autre solution possible utilise Perl: P>

if [[ $string = *[12] ]] ; then
   echo ${string%[12]}$((3-${string: -1}))
else
    echo $string
fi


1 commentaires

Ce script Awk est un mauvais. Pour un démarrage, il s'appuie sur la réglage FS sur NULL fractionnez la chaîne en caractère mais qui est indéfini Bahavior par Posix, de sorte que cela fera des choses différentes dans différentes horaires. Ensuite, si elle divise l'entrée en caractères, il va remplacer chaque occurrence du dernier caractère sur toute la ligne avec 1 ou 2.



2
votes

Vous pouvez essayer de suivre (la correction de la tentative de OP).

echo system1 | 
awk '
{
   val=substr($0,length($0))
   printf("%s%s\n",substr($0,1,length($0)-1),val==1+0?2:(val==2?1:val))
   val=""
}'


2 commentaires

La première solution ne fonctionne pas pour les deux intrants (il a le même problème, mais pour l'autre entrée).


@CHOROBA, merci monsieur pour avoir laissé savoir, a changé maintenant.



1
votes
awk 'BEGIN{FS=OFS=""}($NF==1||$NF==2){$NF=$NF%2+1}1'
This is similar to oguzismail's approach.
Only alters if last char is 1 or 2.
1 % 2 + 1 = 2, and 2 % 2 + 1 = 1.

0 commentaires

3
votes

Pour ce faire de manière concise, robuste et de manière robuste et avec n'importe quel AWK serait:

$ echo system2| awk '!sub(/1$/,2){sub(/2$/,1)}1'
system1
$ echo system1| awk '!sub(/1$/,2){sub(/2$/,1)}1'
system2


0 commentaires