I have a string in the next format
id;some text here with possible ; inside
and want to split it to 2 strings by first occurrence of the ;. So, it should be: id and some text here with possible ; inside
I know how to split the string (for instance, with cut -d ';' -f1), but it will split to more parts since I have ; inside the left part.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
cut sounds like a suitable tool for this:
bash-4.2$ s='id;some text here with possible ; inside' bash-4.2$ id="$( cut -d ';' -f 1 <<< "$s" )"; echo "$id" id bash-4.2$ string="$( cut -d ';' -f 2- <<< "$s" )"; echo "$string" some text here with possible ; inside
But read is even more suitable:
bash-4.2$ IFS=';' read -r id string <<< "$s" bash-4.2$ echo "$id" id bash-4.2$ echo "$string" some text here with possible ; inside
Method 2
With any standard sh (including bash):
sep=';'
case $s in
(*"$sep"*)
before=${s%%"$sep"*}
after=${s#*"$sep"}
;;
(*)
before=$s
after=
;;
esac
read based solutions would work for single character (and with some shells, single-byte) values of $sep other than space, tab or newline and only if $s doesn’t contain newline characters.
cut based solutions would only work if $s doesn’t contain newline characters.
sed solutions could be devised that handle all the corner cases with any value of $sep, but it’s not worth going that far when there’s builtin support in the shell for that.
Method 3
As you have mentioned that you want to assign the values to id and string
first assign your pattern to a variable(say str)
str='id;some text here with possible ; inside'
id=${str%%;}
string=${str#;}
Now you have your values in respective variables
Method 4
Solution in standard bash:
text='id;some text here with possible ; inside'
text2=${text#*;}
text1=${text%"$text2"}
echo $text1
#=> id;
echo $text2
#=> some text here with possible ; insideDD
Method 5
In addition to the other solutions, you could try something regex based:
a="$(sed 's/;.*//' <<< "$s")" b="$(sed 's/^[^;]*;//' <<< "$s")"
or depending on what you are trying to do exactly, you could use
sed -r 's/^([^;]*);(.*)/1 ADD THIS TEXT BETWEEN YOUR STRINGS 2/'
where 1 and 2 contain the two substrings you were wanting.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0