ksh String Manipulation - removing variables from within a variable


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting ksh String Manipulation - removing variables from within a variable
# 1  
Old 01-31-2019
ksh String Manipulation - removing variables from within a variable

Hi. I'd like to remove all values in a string variable that also exist in a second variable. What is the appropriate approach to take here? I can use a 'For' loop and check each element and then populate a new string. But is there a cleaner, simpler way?

E.g. I have the following 2 variables
Code:
NAMES="John Paul George Ringo"
EXCLUDE_NAME="Ringo"

What would be the simplest way to update $NAMES so that all $EXCLUDE_NAME members have been removed?
This works but there must be better way:

Code:
for X in ${NAMES} ; do
    if [[ ! "$EXCLUDE_NAME" =~ "$X" ]]; then
       NEW_NAMES="$NEW_NAMES $X"
    fi
done


Many thanks
# 2  
Old 01-31-2019
Simple form using bash without utilities.
Longhand OSX 10.14.1, default bash terminal.
Code:
Last login: Thu Jan 31 18:23:42 on ttys000
AMIGA:amiga~> NAMES=( John Paul George Ringo )
AMIGA:amiga~> EXCLUDE_NAME='Ringo'
AMIGA:amiga~> STRING=""
AMIGA:amiga~> for (( N=0; N<${#NAMES[$@]}; N++ ));do if [ "${NAMES[$N]}" != "${EXCLUDE_NAME}" ]; then STRING="${STRING} ${NAMES[$N]}"; fi; done
AMIGA:amiga~> echo ${STRING}
John Paul George
AMIGA:amiga~> _

Have fun...
# 3  
Old 01-31-2019
You need to post the ksh version that you use. ksh93 has "Parameter Expansion". man ksh:
Quote:
${parameter/pattern/string}
...
Expands parameter and replaces the longest match of pattern with the given string.
In your case:

Code:
echo ${NAMES//$EXCLUDE_NAME}
 John Paul George

In case $EXCLUDE_NAME contains several space separated strings, you'd need to run a loop across all these strings.
These 2 Users Gave Thanks to RudiC For This Post:
# 4  
Old 01-31-2019
Quote:
Originally Posted by RudiC
You need to post the ksh version that you use. ksh93 has "Parameter Expansion".
Your solution is not only correct - it is so even to the extent that this will work in ksh88 too. In terms of parameter expansion ksh88 and ksh93 are very much identical.

Of course, in ksh88 you would have to write:
Code:
NAMES="Mick Keith Ron Bill Charlie"
EXCLUDE_NAME="Bill"
echo "${NAMES/${EXCLUDE_NAME}/}"

instead to arrive at Mick Keith Ron Charlie. And beware of the -satisfaction option....

bakunin

Last edited by bakunin; 02-01-2019 at 07:14 AM.. Reason: corrected a typo
This User Gave Thanks to bakunin For This Post:
# 5  
Old 01-31-2019
Hi RudiC & bakunin...

I learn something new every day.
That expansion, new to me, works in bash too.
(Sadly it is not POSIX compliant though.)


Super stuff.
Thanks a mil'.


Bazza.
# 6  
Old 01-31-2019
@bakunin: I can't get no ... oh!


Parameter expansion gets to combine array expansion with the substitution expansions in both bash and ksh93:
Code:
$ namea=( John Paul George Ringo )
$ exclude=Ringo
$ echo ${namea[@]//$exclude/}
John Paul George

but notice this difference between the two shells:
bash:
Code:
$ nameb=( ${namea[@]//$exclude/} )
$ echo ${#nameb[@]}
3

ksh93:
Code:
$ nameb=( ${namea[@]//$exclude/} )
$ echo ${#nameb[@]}
4

so in bash you could use this method to delete an item from an array but in ksh93 it will simply empty the item.


Andrew
# 7  
Old 02-01-2019
Still, this is string substitution.
// is global substitution (retry if successful)
/ is one substitution
Only ksh93 has it correctly implemented (and bash-4, while bash-2 and bash-3 have a little bug in it).
For example, Solaris ksh88:
Code:
echo "${NAMES//${EXCLUDE_NAME}}"
ksh: "${NAMES//${EXCLUDE_NAME}}": bad substitution


Last edited by MadeInGermany; 02-01-2019 at 05:16 AM..
These 2 Users Gave Thanks to MadeInGermany For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Variable string manipulation

Hi, I have a variable with grep output like this: WORDS=$(grep -r -c -i -E "palindrom" /"$DIRECTORY"/) so "echo "$WORDS"" could be: //directory/file1.txt:0 //directory/file2.txt:0 //directory/file3.txt:3 //directory/file4.txt:1 //directory/file5.txt:0 I need to "sed" my variable... (3 Replies)
Discussion started by: Hornys
3 Replies

2. Shell Programming and Scripting

How to convert string(variable) into date( epoch) in ksh on HPUX machine?

Hi all, I have used a bash script which ultimately converts a string into date using date --date option: DATE=$DATE" "$TIME" "`date +%Y` //concatenating 2 strings TMRW_DATE=`date --date="$DATE" +"%s"` //applying date command on string and getting the unixtime Please use code tags... (7 Replies)
Discussion started by: Rashu123
7 Replies

3. Shell Programming and Scripting

String manipulation using ksh script

Hi, I need to convert string "(joe.smith" into "joe_smith" i.e. I need to remove the leading opening brace '(' and replace the dot '.' with an under score '_' can anyone suggest a one liner ksh script or unix command for this please (3 Replies)
Discussion started by: sdj
3 Replies

4. Shell Programming and Scripting

Ksh in Linux Removing: "\0" From String

Hi All, I am facing a problem and I am not able to solve it. I have already searched google, but nothing (maybe I am not using the correct key words). As a database query result, I have a file like below: fmv:/home/fmv/tmp>cat TestBackRef.txt /^TEST\(\{4\}\)X\{12\}Y\.txt$/\0#\1/#Test... (2 Replies)
Discussion started by: felipe.vinturin
2 Replies

5. Shell Programming and Scripting

Bash:How to split one string variable in two variables?

Hello, I have a paramter $param consisting just of two literals and want to split it into two parameters, so I can combine it to a new parameter <char1><string><char2>, but the following code didn't work: tmp_PARAM_1=cut -c1 $PARAM tmp_PARAM_2=cut -c2 $PARAM... (2 Replies)
Discussion started by: ABE2202
2 Replies

6. Shell Programming and Scripting

Bash string variable manipulation

In a bash script I've set a variable that is the directory name of where an executable lives. the_dir=`dirname $which myscript` which equates to something like "/path/to/dir/bin" I need to cut that down to remove the "bin" so I now have "/path/to/dir/". This sounds easy but as a... (2 Replies)
Discussion started by: Witty
2 Replies

7. Shell Programming and Scripting

string manipulation in ksh

Hi all, I'm trying to extract the name of a script that is being run with a full path. i.e. if the script name is /some/where/path/script_name.ksh I'd like to extract only: script_name i know that it is possible to do so in two phases: echo "${0##*/}" will give me script_name.ksh and... (4 Replies)
Discussion started by: iceman
4 Replies

8. UNIX for Dummies Questions & Answers

String manipulation using ksh

I have a UNIX shell where: LEVEL=dev SITE=here and WHEREIAM=/tmp/$SITE/location/$LEVEL I want to echo $WHEREIAM in such a way that I get it back with all the environment variables resolved (/tmp/here/location/dev). This command will be used in a shell script. (5 Replies)
Discussion started by: zambo
5 Replies

9. Shell Programming and Scripting

KSH split string into variables

Hello, I am an intermediate scripter. I can usually find and adapt what I need by searching through previous postings, but I'm stumped. I have a string with the format "{Name1 Release1 Type1 Parent1} {Name2 Release2 Type2 Parent2}". It is being passed as an argument into a ksh script. I need to... (5 Replies)
Discussion started by: drd_2b
5 Replies

10. UNIX for Dummies Questions & Answers

extract from string variable into new variables

I have a variable which consists of a string like this: 001 aaabc 44 a bbb12 How do I extract each substring, delimited by the spaces, into new variables - one for each substring? eg var1 will be 001, var2 will be aaabc, var3 will be 44, var4 will be a, etc? I've come up with this:... (2 Replies)
Discussion started by: Sniper Pixie
2 Replies
Login or Register to Ask a Question