views:

304

answers:

8

I just want to match some text in a BASH script, i’v tried using sed, but I can’t seem to make it just output the match instead of replacing it with something.

echo -E "TestT100String" | sed 's/[0-9]+/dontReplace/g'

Which will output: TestTdontReplaceString

Which isn’t what I want, I want it to output: 100

Ideally I would want it to put all the matches in an array.

edit: Text input is coming in as a string:

newName()
{
 #Get input from function
 newNameTXT="$1"

 if [[ $newNameTXT ]]; then
 #Use code that im working on now, using the $newNameTXT string.

 fi
}
+1  A: 

Use grep. Sed is an editor. If you only want to match a regexp, grep is more than sufficient.

Mic
SED doesn't write to the source file - only way for that to happen is if you write the output with the same filename in order to overwrite the file.
OMG Ponies
True, but sed is still an editor. Its name is even short for stream editor. If he only needs to match he can use grep.
Mic
i don't think he wants to match. He says he needs the 100
so using grep's -o should do the job
Yep, I need the 100, working solution found though, thanks to your guys (especially Dennis)
Mint
+3  A: 

You could do this purely in bash using the double square bracket [[ ]] test operator, which stores results in an array called BASH_REMATCH:

[[ "TestT100String" =~ ([0-9]+) ]] && echo "${BASH_REMATCH[1]}"
John Kugelman
+3  A: 
echo "TestT100String" | sed 's/[^0-9]*\([0-9]\+\).*/\1/'

echo "TestT100String" | grep -o  '[0-9]\+'

The method you use to put the results in an array depends somewhat on how the actual data is being retrieved. There's not enough information in your question to be able to guide you well. However, here is one method:

index=0
while read -r line
do
    array[index++]=$(echo "$line" | grep -o  '[0-9]\+')
done < filename

Here's another way:

array=($(grep -o '[0-9]\+' filename))
Dennis Williamson
Added in the input method in the original question. (it’s input is in the forum of a string)
Mint
A: 

Well , the Sed with the s/"pattern1"/"pattern2"/g just replaces globally all the pattern1s to pattern 2.

Besides that, sed while by default print the entire line by default . I suggest piping the instruction to a cut command and trying to extract the numbers u want :

If u are lookin only to use sed then use TRE:

sed -n 's/.*\(0-9\)\(0-9\)\(0-9\).*/\1,\2,\3/g'.

I dint try and execute the above command so just make sure the syntax is right. Hope this helped.

tomkaith13
A: 

using awk

linux$ echo -E "TestT100String" | awk '{gsub(/[^0-9]/,"")}1'
100
A: 

using just the bash shell

declare -a array
i=0
while read -r line
do
        case "$line" in
            *TestT*String* )
            while true
            do
                line=${line#*TestT}
                array[$i]=${line%%String*}
                line=${line#*String*}
                i=$((i+1))
                case "$line" in
                    *TestT*String* ) continue;;
                    *) break;;
                esac
            done
            esac
done <"file"
echo ${array[@]}
A: 

I don't know why nobody ever uses expr: it's portable and easy.

newName()
{
 #Get input from function
 newNameTXT="$1"

 if num=`expr "$newNameTXT" : '[^0-9]*\([0-9]\+\)'`; then
  echo "contains $num"
 fi
}
ephemient
A: 

Pure Bash. Use parameter substitution (no external processes and pipes):

string="TestT100String"

echo ${string//[^[:digit:]]/}

Removes all non-digits.

fgm