Search code examples
bashawksedcut

Getting (not cutting) specific substring from bash string


I would like to get sub-string VALUE1 or VALUE2 from the the string "VALUE3,VALUE2,VALUE4,VALUE9" and if there is none of these then my $VAR should be empty.

My String cannot have both sub-strings at the same time so we have only 3 possibilities.

VAR=VALUE1 VAR=VALUE2 VAR=NULL

I would like to do it in one line something like:

STRING="VALUE3,VALUE2,VALUE4,VALUE9,VALUE7"
VAR=`echo $STRING | grep -P "(VALUE1|VALUE2)"`
echo $VAR
VALUE2

Solution

  • This will print NULL in case VALUE1 or VALUE2 none of them are found.

    echo "VALUE3,VALUE1,VALUE4,VALUE9" | awk '
    {
      if(match($0,/VALUE[12],|VALUE[12]$/)){
        val=substr($0,RSTART,RLENGTH)
        sub(/,/,"",val)
        print val
      }
      else{
        print "NULL"
      }
    }'
    

    OR to take it into a variable use like:

    VAR=$(echo "VALUE3,VALUE1,VALUE4,VALUE9" | awk '{if(match($0,/VALUE[12],|VALUE[12]$/)){val=substr($0,RSTART,RLENGTH);sub(/,/,"",val);print val} else{print "NULL"}}')
    echo "$VAR"
    VALUE1
    

    Example of getting NULL in output in case neither VALUE1 nor VALUE2:

    VAR=$(echo "VALUE3,VALUE12,VALUE4,VALUE9" | awk '{if(match($0,/VALUE[12],|VALUE[12]$/)){val=substr($0,RSTART,RLENGTH);sub(/,/,"",val);print val} else{print "NULL"}}')
    echo "$VAR"
    NULL