2 votes

Imprimer tous les palindromes du fichier texte

J'ai regardé cette question: BASH Vérificateur de Palindrome. Voici ce que montre la réponse à la question de ce fil de discussion:

grep -E '^[a-z]{3,45}$' /usr/share/dict/words | while read -r word;
    do [ $word == `echo $word | rev` ] && echo $word;
done;

Je comprends que cela lit à partir de "words" mais j'ai du mal à essayer de le modifier pour lire à partir d'un fichier texte au lieu de /usr/share/dict/words. Je veux qu'il lise n'importe quel fichier texte que je demande, donc je peux mettre:

source palindrome *nom_fichier*

et cela affichera les palindromes trouvés dans le fichier dans la console. Ensuite, je veux pouvoir le faire pour pouvoir le sortie dans un fichier de sortie:

source palindrome *nom_fichier* >> output.txt

J'ai essayé de faire cela mais cela ne fonctionne pas et je ne suis vraiment pas sûr de ce que je dois changer pour qu'il lise mon fichier:

#!usr/bin/bash

function search
{
    filename=$1

    grep -E '^[a-z]{3,45}$' "$filename" | while read -r word;
        do [ $word == `echo $word | rev` ] && echo $word;
    done;
}
search $1

Si des solutions sont données elles pourraient être dans un format similaire? Je n'ai pas encore appris beaucoup d'autres techniques. Si des solutions plus complexes sont données, pourriez-vous expliquer un peu le code donné s'il vous plaît.


Le fichier d'entrée est d'un livre électronique, il est extrêmement long donc un petit extrait est: (je réalise que cela ne montre pas de palindromes dans l'extrait mais c'est juste pour montrer quel type de fichier texte c'est)

O and that lotion mustn't forget.
Fever near her mouth. Your head it simply. Hair braided over: shell with
seaweed. Why do they hide their ears with seaweed hair?

Lorsque je lance la commande source palindrome nom_fichier il n'y a pas de message d'erreur. J'appuie sur Entrée et le terminal me permet de taper à nouveau n'importe quoi. Il ne semble pas qu'il exécute le script.

2voto

John Kugelman Points 108754
#!/bin/bash

function search
{
    grep -oiE '[a-z]{3,}' "$@" | tr '[:upper:]' '[:lower:]' | while read -r word; do
        [[ $word == $(rev <<< "$word") ]] && echo "$word"
    done
}

search "$@"

Le dictionnaire pour lequel ce code original a été écrit contenait un seul mot en minuscules sur chaque ligne. Pour analyser un fichier texte avec plusieurs mots de casse mixte par ligne, vous avez besoin de quelques modifications:

  • Retirer les ancres ^ et $ de l'expression rationnelle pour trouver des mots n'importe où sur une ligne.
  • Utiliser grep -o pour afficher les mots correspondants.
  • Utiliser grep -i pour correspondre aux lettres en majuscules et minuscules.
  • Utiliser tr pour passer les lettres majuscules en minuscules.

Autres corrections:

  • Changer la ligne de shebang en #!/bin/bash. Cela devrait être un chemin absolu, et les deux formes préférées sont soit #!/bin/bash soit #!/usr/bin/env bash.
  • Changer £word en $word.
  • Utiliser "$@" pour que search() puisse accepter plusieurs noms de fichiers.

Améliorations:

  • Il n'y a aucune raison particulière de limiter les mots à 45 caractères. {3,} supprime la limite supérieure.
  • Les doubles crochets [[ ]] sont meilleurs que les simples crochets [ ].
  • $(cmd) est mieux que `cmd`.
  • rev <<< "$word" est mieux que echo "$word" | rev.

1voto

Indent Points 4162

Votre ligne de shebang est incorrecte. Changez :

#!/usr/bin/bash

à

#!/usr/bin/bash

ou

#!/bin/bash

0voto

Arjun Points 146

Que diriez-vous de ceci (sans script) :

comm -12 <(nl foo) <(rev foo | nl) | cut -f2

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