Bash Array String operations

Array String operations

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