Search code examples
bashloopsgreppalindrome

BASH Palindrome Checker


This is my first time posting on here so bear with me please.

I received a bash assignment but my professor is completely unhelpful and so are his notes.

Our assignment is to filter and print out palindromes from a file. In this case, the directory is:

/usr/share/dict/words

The word lengths range from 3 to 45 and are supposed to only filter lowercase letters (the dictionary given has characters and uppercases, as well as lowercase letters). i.e. "-dkas-das" so something like "q-evvavve-q" may count as a palindrome but i shouldn't be getting that as a proper result.

Anyways, I can get it to filter out x amount of words and return (not filtering only lowercase though).

grep "^...$" /usr/share/dict/words |
grep "\(.\).\1" 

And I can use subsequent lines for 5 letter words and 7 and so on:

grep "^.....$" /usr/share/dict/words |
grep "\(.\)\(.\).\2\1" 

But the prof does not want that. We are supposed to use a loop. I get the concept but I don't know the syntax, and like I said, the notes are very unhelpful.

What I tried was setting variables x=... and y=.. and in a while loop, having x=$x$y but that didn't work (syntax error) and neither did x+=..

Any help is appreciated. Even getting my non-lowercase letters filtered out.

Thanks!

EDIT:

If you're providing a solution or a hint to a solution, the simplest method is prefered. Preferably one that uses 2 grep statements and a loop.

Thanks again.


Solution

  • Like this:

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

    Output using my dictionary:

    aha
    bib
    bob
    boob
    ...
    wow
    

    Update

    As pointed out in the comments, reading in most of the dictionary into a variable in the for loop might not be the most efficient, and risks triggering errors in some shells. Here's an updated version:

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