Extract Values Following Specific Substrings in String Containing Spaces Using Awk
I Have This Single Line String. Wordpress Version: 5.5.3 Database Revision: 48748 Tinymce Version: 4.9100 (49100-20200624) Package Language: En_Us I Would Like...
I have this single line string.
WordPress version: 5.5.3 Database revision: 48748 TinyMCE version: 4.9100 (49100-20200624) Package language: en_US
I would like to extract 5.5.3 and en_US
This is the closest example I am able to come up with where a space is the delimiter.
`awk -F" " '{print $3 $13 }' <<< 'WordPress version: 5.5.3 Database revision: 48748 TinyMCE version: 4.9100 (49100-20200624) Package language: en_US'`
which returns
5.5.3en_US
I have looked at other examples and I am not getting anywhere. I would prefer to not rely on any counts ($3 and $13) and take the first value after a substring. In this case, WordPress version: and Package language:
Putting these two variables into an array would be awesome. Appreciate any help.
1 Answer
If awk is no requirement you could just cut string into substrings with grep,
replace colons with = and whitespaces with _ with sed.
The output could evaluated with eval to make it variables
WordPress version: 5.5.3 -> WordPress_version=5.5.3
Database revision: 48748 -> Database_revision=48748
TinyMCE version: 4.9100 -> TinyMCE_version=4.9100
Package language: en_US -> Package_language=en_US
to make this work you need to differ variable names from variable values.
in this example this is done by len so en_US is treated as value
#!/bin/bash
# input string
text='WordPress version: 5.5.3 Database revision: 48748 TinyMCE version: 4.9100 (49100-20200624) Package language: en_US'
# variable length
len=6
# find variable names based on length
for var in $(echo "$text" | grep -oE "[^(0-9:)]{$((len+1)),}" | grep -oE '\S.*' | sed -n 's,\s,.,p')
do
# convert substrings and set variables name=value
eval "$(echo "$text" | grep -oE "$var:\s+\S+" | sed -nr 's,:\s+,=,p' | sed -n 's,\s,_,p')"
done
# print variable info
declare -p | grep -E 'declare -- [A-Za-z]+_\S+='
Note: eval is just used for demonstration. the above code is compatible with (da)sh. in bash you can create array instead of multiple variables