Bash Array String operations
Bash
Download (.zip)
#!/bin/bash # array-strops.sh: String operations on arrays. # Script by Michael Zick. # Used with permission.
# In general, any string operation in the ${name ... } notation #+ can be applied to all string elements in an array #+ with the ${name[@] ... } or ${name[*] ...} notation.
arrayZ=( one two three four five five )
echo
# Trailing Substring Extraction echo ${arrayZ[@]:0} # one two three four five five # All elements.
echo ${arrayZ[@]:1} # two three four five five # All elements following element[0].
echo ${arrayZ[@]:1:2} # two three # Only the two elements after element[0].
echo "-----------------------"
# Substring Removal # Removes shortest match from front of string(s), #+ where the substring is a regular expression.
echo ${arrayZ[@]#f*r} # one two three five five # Applied to all elements of the array. # Matches "four" and removes it.
# Longest match from front of string(s) echo ${arrayZ[@]##t*e} # one two four five five # Applied to all elements of the array. # Matches "three" and removes it.
# Shortest match from back of string(s) echo ${arrayZ[@]%h*e} # one two t four five five # Applied to all elements of the array. # Matches "hree" and removes it.
# Longest match from back of string(s) echo ${arrayZ[@]%%t*e} # one two four five five # Applied to all elements of the array. # Matches "three" and removes it.
echo "-----------------------"
# Substring Replacement
# Replace first occurance of substring with replacement echo ${arrayZ[@]/fiv/XYZ} # one two three four XYZe XYZe # Applied to all elements of the array.
# Replace all occurances of substring echo ${arrayZ[@]//iv/YY} # one two three four fYYe fYYe # Applied to all elements of the array.
# Delete all occurances of substring # Not specifing a replacement means 'delete' echo ${arrayZ[@]//fi/} # one two three four ve ve # Applied to all elements of the array.
# Replace front-end occurances of substring echo ${arrayZ[@]/#fi/XY} # one two three four XYve XYve # Applied to all elements of the array.
# Replace back-end occurances of substring echo ${arrayZ[@]/%ve/ZZ} # one two three four fiZZ fiZZ # Applied to all elements of the array.
echo ${arrayZ[@]/%o/XX} # one twXX three four five five # Why?
echo "-----------------------"
# Before reaching for awk (or anything else) -- # Recall: # $( ... ) is command substitution. # Functions run as a sub-process. # Functions write their output to stdout. # Assignment reads the function's stdout. # The name[@] notation specifies a "for-each" operation.
newstr() { echo -n "!!!" }
echo ${arrayZ[@]/%e/$(newstr)} # on!!! two thre!!! four fiv!!! fiv!!! # Q.E.D: The replacement action is an 'assignment.'
# Accessing the "For-Each" echo ${arrayZ[@]//*/$(newstr optional_arguments)} # Now, if Bash would just pass the matched string as $0 #+ to the function being called . . .
echo
exit 0
|