J'essaie de trouver un moyen de déterminer la différence entre deux chaînes de mon script. Je pourrais facilement le faire avec diff ou comm, mais je ne m'occupe pas de fichiers et je préfère ne pas les exporter dans des fichiers, faire la comparaison et la relire.
Je vois que comm, diff, cmp permettent tous de passer soit deux fichiers, soit un fichier et une entrée standard - je suppose que c'est bien si je ne veux pas sortir deux fichiers ... mais c'est toujours un peu nul.
J'ai fouillé en pensant que je pouvais utiliser grep ou des expressions régulières - mais je suppose que non.
Réponses:
En utilisant
diff
oucom
ou ce que vous voulez:FAQ Greg's Bash: Substitution de processus
ou avec un tube nommé
FAQ Greg's Bash: Travailler avec des tubes nommés
Le tube nommé est également connu sous le nom de FIFO.
Le
-
seul est pour l'entrée standard.<<<
est une "chaîne ici".&
est comme;
mais le met en arrière-planla source
FUNC(){ echo "$@"; "$@"; }; FUNC diff <(echo a) <(echo b);
$ diff <(echo "Here are the letters in String One.") <(echo "Here are the characters in String Two.")
\n
1c1
\n
< Here are the letters in String One.
\n
---
\n
> Here are the characters in String Two.
\n
utilisation du tube est similaire, sauf qu'il montre un numéro de processus, commence par1c1
après le suivant$
et attend que vous appuyiez sur <kbd> Entrée <kbd> (ou vous pouvez faire d'autres commandes ...)Cela me rappelle cette question: comment pouvez-vous différencier deux pipelines dans Bash?
Si vous êtes dans une session bash, vous pouvez faire un:
avec la
<
création de tubes nommés anonymes - gérés par bash - afin qu'ils soient créés et détruits automatiquement, contrairement aux fichiers temporaires.Donc 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:
(si vous supposez avoir dans votre fichier des lignes comme
string1=very_complicated_value
et astring2=another_long_and_complicated_value'
: sans connaître le format interne de votre fichier, je ne peux pas recommander une commande précise)la source
Je préfère
cmp
et la fonction de substitution de processus de bash:En disant à la position 2, ab se produit pour le premier, mais aq pour le second. En position 5, une autre différence se produit. Remplacez simplement ces chaînes par des variables, et vous avez terminé.
la source
Disons que vous avez trois chaînes
Pour supprimer le préfixe b d'un
Pour supprimer le suffixe c d'un
la source
echo "$a" | sed "s!^$b!!g"
(j'ai échangé le séparateur sed standard / pour! Au cas où les variables traitées sont des chemins. De plus, vous pouvez utiliser une chaîne ici au lieu de echo:.sed ... <<< $a
)Un autre exemple:
Les sorties
Réponse originale ici
la source