String manipulation

How to modify strings from a variable in bash without losing your sanity

[gamma:~] s=1234

# only remove from the beggining of the string

[gamma:~] echo ${s#2}
1234
[gamma:~] echo ${s#12}
34
[gamma:~] echo ${s#34}
1234

% ony remove from the end of the string

[gamma:~] echo ${s%34}
12

to remove substrings from anywhere inside the string

[gamma:~] echo ${s/23/}
14

String extraction

you can also use regexps. With a bit of care, tough. For example, say you have this string: artist:"Veruca Salt" title:"Best You Can Get" album:"Resolver", and you want to extract, say, the album field. The idea for the regexp would be: match anything that starts with album:, then has a ", then stuff that isn't ", and then a final ". You'll need something like the following

[gamma:~] expr match 'artist:"Veruca Salt" title:"Best You Can Get" album:"Resolver"' '.*album:"\([^"]\+\)"'
Resolver

Why the .*? because expr implicitly adds a ^ in front of each regexp it receives. FSM only knows why.

Why the \( \)? because by default, expr only returns the length of the match. Look

[gamma:~] expr match 'artist:"Veruca Salt" title:"Best You Can Get" album:"Resolver"' '.*artist:"[^"]\+"'
20

the parentheses, if present, tell to expr to return the part of the match surrounded by them

[gamma:~] expr match 'artist:"Veruca Salt" title:"Best You Can Get" album:"Resolver"' '.*artist:"\([^"]\+\)"'
Veruca Salt

References

http://tldp.org/LDP/abs/html/string-manipulation.html