#!/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