Find string in list with wildcards


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Find string in list with wildcards
# 8  
Old 06-25-2009
That's a verbose ksh error!

Did you copy the whole scripts (i.e. including the "#!/bin/ksh" part?). Is there more output that that?

I ran the very same and it worked fine for me...

Code:
#!/bin/ksh
set -x
ok_versions="04-01-*|03-02-4"
my_version='04-01-2'
if [[ ${my_version} = +(${ok_versions}) ]]; then
   echo match
else
   echo no match
fi

Code:
+ ok_versions='04-01-*|03-02-4'
+ my_version=04-01-2
+ [[ 04-01-2 == +(04-01-*|03-02-4) ]]
+ echo match
match

# 9  
Old 06-25-2009
ok, this should do it then:
Code:
#!/bin/sh
set -x

ok_versions="04-01-*|03-02-4"

my_version='04-01-2'
#   ${ok_versions} ) echo match

case ${my_version} in
   04-01-*|03-02-4 ) echo match
                   ;;
   *             ) echo no match
                   ;;
esac

The same problem though - cannot use the '${ok_versions}' - wondering if there's something fundamentally wrong the I understand it....
# 10  
Old 06-25-2009
Quote:
Originally Posted by vgersh99
ok, this should do it then:
Code:
#!/bin/sh
set -x

ok_versions="04-01-*|03-02-4"

my_version='04-01-2'
#   ${ok_versions} ) echo match

case ${my_version} in
   04-01-*|03-02-4 ) echo match
                   ;;
   *             ) echo no match
                   ;;
esac

The same problem though - cannot use the '${ok_versions}' - wondering if there's something fundamentally wrong the I understand it....

Bash considers a variable in the pattern of a case statement to be a single argument; ksh interprets the expansion as it would a literal string.

This will work:
Code:
eval "
case ${my_version} in
   ${ok_versions} ) echo match
                   ;;
   *             ) echo no match
                   ;;
esac
"

In other posts, [[ ... ]] and extended globbing were used. These are both non-standard, so there is no guarantee that different shells (or even different versions of the same shell) will all work the same way.


---------- Post updated at 06:59 PM ---------- Previous update was at 06:35 PM ----------

Quote:
Originally Posted by Johan III
I need to add code to a shell script to find out if a string matches any item in a list, where the list can contain a wildcard character.

For example, if I have the following list:
ok_versions="03-02-4, 04-01-*"

Then I want to compare a particular string to see if it matches any item in the list. For example, I could have a string like the following
my_version="04-01-2".

I want to check my_version against ok_versions, and note that my_version is ok if it is 03-02-4, 04-01-1, 04-01-2, etc., but that it is not ok if it doesn't match one of the patterns. The ok_versions list could have any number of entries (not just two).

Code:
ok_versions="03-02-4, 04-01-*"
my_version="04-01-2".

set -f
good=0
for ok in $ok_versions
do
  case $my_version in
    $ok) good=1 ;;
  esac
done
set +f
[ $good -eq 1 ] && echo match || echo no match

# 11  
Old 06-25-2009
Quote:
Originally Posted by cfajohnson

Bash considers a variable in the pattern of a case statement to be a single argument; ksh interprets the expansion as it would a literal string.

Ahhh, I see, I see. Is that a 'feechah' (if you know what I'm saying) or is it a well know limitation (and/or just the way the shells've been implemented?
Because I'd expect the variable to be evaluated by itself.......
Quote:
Originally Posted by cfajohnson
This will work:
Code:
eval "
case ${my_version} in
   ${ok_versions} ) echo match
                   ;;
   *             ) echo no match
                   ;;
esac
"

OK - I understand.
Quote:
Originally Posted by cfajohnson
In other posts, [[ ... ]] and extended globbing were used. These are both non-standard, so there is no guarantee that different shells (or even different versions of the same shell) will all work the same way.
Yeah, I know I know Smilie
trying figure out how to fix the OTHER way with globing:
Code:
#!/bin/ksh
set -x

ok_versions="04-01-*|03-02-4"
#ok_versions='04-01-*'

my_version='04-01-2'
#   04-01-*|03-02-4 ) echo match

eval "
case ${my_version} in
   ${ok_versions} ) echo match
                   ;;
   *             ) echo no match
                   ;;
esac
"

# ???? This does not work!!!!
eval "
if [ ${my_version} = +(${ok_versions}) ]; then
   echo match
else
   echo no match
fi



---------- Post updated at 06:59 PM ---------- Previous update was at 06:35 PM ----------


Code:
ok_versions="03-02-4 04-01-*"
my_version="04-01-2".

set -f
good=0
for ok in $ok_versions
do
  case $my_version in
    $ok) good=1 ;;
  esac
done
set +f
[ $good -eq 1 ] && echo match || echo no match


Last edited by vgersh99; 06-25-2009 at 08:41 PM.. Reason: removed ',' from ok_version of the last 'approach'
# 12  
Old 06-25-2009
Thank you, cfajohnson!

I tried both approaches you gave. The "eval" code worked. The second approach ("set -f", etc) worked for my_version="04-01-2" but didn't report a match for my_version="03-02-4". I then removed the comma from the ok_versions string. Now everything works with that approach too.

Thank you to everyone who helped with this issue. I should be able to integrate this solution into my code.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Find string in file and find the all records by string

Hello I would like to get know how to do this: I got a big file (about 1GB) and I need to find a string (for instance by grep ) and then find all records in this file based on a string. Thanks for advice. Martin (12 Replies)
Discussion started by: mape
12 Replies

2. UNIX for Dummies Questions & Answers

Find command and use of wildcards

greetings, below is the find command i am using for some filesystem maintenance: find /data/Engine \( -type d -name .snapshot -prune -o -type d -wholename "/data/Engine/*/CAE" \ -prune -o -type d -wholename "/data/Engine/*/CAD" -prune -o -name ".*.case" \)\ -mtime +365 -print0 -fls... (5 Replies)
Discussion started by: crimso
5 Replies

3. Shell Programming and Scripting

Grep string in files and list file names that contain the string

Hi, I have a list of zipped files. I want to grep for a string in all files and get a list of file names that contain the string. But without unzipping them before that, more like using something like gzcat. My OS is: SunOS test 5.10 Generic_142900-13 sun4u sparc SUNW,SPARC-Enterprise (8 Replies)
Discussion started by: apenkov
8 Replies

4. UNIX for Dummies Questions & Answers

[Solved] Wildcards used in find, ls and grep commands

Platforms : Solaris 10 and RHEL 5.6 I always get double quotes , single quotes and asteriks mixed up for find, ls and grep commands. The below commands retrieve the correct results. But , unders stress , I get all these mixed up :mad: .So, i wanted to get a clear picture. Please check if... (7 Replies)
Discussion started by: John K
7 Replies

5. UNIX for Dummies Questions & Answers

Find the list of filenames that have the string 31 at 4th and 5th position

Hi, Can anyone let me know the command to know the list of filenames that have string 31 in their 4th and 5th positions inside the file: grep -l "31" main*.txt The above grep lists all the files which have 31 at any position but I want filenames having 31 at position 4 and position 5. (8 Replies)
Discussion started by: okkadu
8 Replies

6. Shell Programming and Scripting

find string(s) in text file and nearby data, export to list help

Hi, So I'm kinda new to shell scripts and the like. I've picked up quite a bit of use from browsing the forums here but ran into a new one that I can't seem to find an answer for. I'm looking to parse/find a string AND the next 15 or so charachters that follow the string within a text file... (1 Reply)
Discussion started by: kar23me
1 Replies

7. Linux

Find String in FileName and move the String to new File if not found

Hi all, I have a question.. Here is my requirement..I have 500 files in a path say /a/b/c I have some numbers in a file which are comma seperated...and I wanted to check if the numbers are present in the FileName in the path /a/b/c..if the number is there in the file that is fine..but if... (1 Reply)
Discussion started by: us_pokiri
1 Replies

8. Homework & Coursework Questions

Need help using find or locate with wildcards

Use and complete the template provided. The entire template must be completed. If you don't, your post may be deleted! 1. The problem statement, all variables and given/known data: List all files in ~c12100 directory beginning with "BOZO" that end with either "123" or "456" 2. Relevant... (3 Replies)
Discussion started by: ScarletRavin
3 Replies

9. Shell Programming and Scripting

Help to find string and return following characters from list of files

Hi, I'm fairly new to UNIX, but hopefully some-one can help me with this: I am using the following code to find files with the name "example.xml": find . -name "example.xml" -print that would print me a list like the example here: ./dir1/dir2/example.xml... (5 Replies)
Discussion started by: boijie
5 Replies

10. Shell Programming and Scripting

Help--Using wildcards in string comparison

Hi, I want to compare two strings using wild cards. In the file run_test i have if ; then cp ../stimulus/default_value.in ../log/$1.log fi When I issue the command run_test i2c_default_test in the command line, the cp command is not executed. Whereas if i give the following code,... (2 Replies)
Discussion started by: deepae
2 Replies
Login or Register to Ask a Question