129 votes

Différence entre les chaînes de caractères en Bash

J'essaie de trouver un moyen de déterminer la différence entre deux chaînes de caractères dans mon script. Je pourrais facilement le faire avec diff ou comm, mais je n'ai pas affaire à des fichiers et je préférerais ne pas les sortir dans des fichiers, faire la comparaison et la relire.

Je vois que comm, diff, cmp permettent tous de passer soit deux fichiers OU un fichier et l'entrée standard - je suppose que c'est bien si je ne veux pas sortir deux fichiers... mais c'est quand même un peu nul.

Je me suis creusé la tête en pensant que je pouvais utiliser grep ou des expressions régulières - mais je suppose que non.

229voto

Ian Kelling Points 1835

Utilisation de diff o com ou ce que vous voulez :

diff  <(echo "$string1" ) <(echo "$string2")

La FAQ du Bash de Greg : Substitution de processus

ou avec un tuyau nommé

mkfifo ./p
diff - p <<< "$string1" & echo "$string2" > p

La FAQ du Bash de Greg : Travailler avec des tuyaux nommés

Le tube nommé est également connu sous le nom de FIFO.

El - à lui seul est pour l'entrée standard.

<<< est une "chaîne ici".

& c'est comme ; mais le met en arrière-plan

21voto

VonC Points 414372

Ça me rappelle cette question : Comment différencier deux pipelines en Bash ?

Si vous êtes dans une session bash, vous pouvez faire un :

diff <cmd1 <cmd2
diff <(foo | bar) <(baz | quux)

avec < la création de tuyaux anonymes nommés -- gérés par bash -- afin qu'ils soient créés et détruits automatiquement, contrairement aux fichiers temporaires.

Ainsi, si vous parvenez à isoler vos deux chaînes différentes dans le cadre d'une commande (grep, awk, sed, ...), vous pouvez faire - par exemple - quelque chose comme :

diff < grep string1 myFile < grep string2 myFile

(si vous supposez que vous avez dans votre fichier des lignes comme string1=very_complicated_value et un string2=another_long_and_complicated_value' : sans connaître le format interne de votre fichier, je ne peux pas vous recommander une commande précise)

15voto

Je préfère cmp et la fonction de substitution de processus de bash :

$ cmp -bl <(echo -n abcda) <(echo -n aqcde)
  2 142 b    161 q
  5 141 a    145 e

En disant sur la position 2, un b se produit pour la première, mais un q pour la seconde. En position 5, une autre différence se produit. Il suffit de remplacer ces chaînes de caractères par des variables, et vous avez terminé.

12voto

Pithikos Points 1227

Disons que vous avez trois cordes

a="this is a line"
b="this is"
c="a line"

Pour supprimer le préfixe b de a

echo ${a#"$b"}  # a line

Pour supprimer le suffixe c d'un

echo ${a%"$c"}  # this is

2voto

Sida Zhou Points 356

Un autre exemple :

before="184613 102050 83756 63054"
after="184613 102050 84192 83756 63054"

comm -23 <(tr ' ' $'\n' <<< $after | sort) <(tr ' ' $'\n' <<< $before | sort)

Sorties

84192

Réponse originale ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X