Tuesday 31 December 2019

linux - In shell, split a portion of a string with dot as delimiter




I am new to shell scripting, can you please help with below requirement, thanks.



$AU_NAME=AU_MSM3-3.7-00.01.02.03
#separate the string after last "-", with "." as delimiter
#that is, separate "00.01.02.03" and print/save as below.
major=00
minor=01
micro=02
build=03

Answer



First, note that you don't use $ when assigning to a parameter in the shell. Your first line should be just this:



AU_NAME=AU_MSM3-3.7-00.01.02.03


Once you have that, then you can do something like this:



IFS=. read major minor micro build <${AU_NAME##*-}
EOF


where the ##*- strips off everything from the beginning of the string through the last '-', leaving just "00.01.02.03", and the IFS (Internal Field Separator) variable tells the shell where to break the string into fields.



In bash, zsh, and ksh93+, you can get that onto one line by shortening the here-document to a here-string:



IFS=. read major minor micro build <<<"${AU_NAME##*-}"


More generally, in those same shells (or any other shell that has arrays), you can split into an arbitrarily-sized array instead of distinct variables. This works in the given shells:



IFS=. components=(${AU_NAME##*-})


In older versions of ksh you can do this:



IFS=. set -A components ${AU_NAME##*-}


That gets you this equivalence (except in zsh, which by default numbers the elements 1-4 instead of 0-3):



major=${components[0]}
minor=${components[1]}
micro=${components[2]}
build=${components[3]}

No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...