LDP/LDP/guide/docbook/abs-guide/array-strops.sh

119 lines
3.7 KiB
Bash

#!/bin/bash
# array-strops.sh: String operations on arrays.
# Script by Michael Zick.
# Used in ABS Guide with permission.
# Fixups: 05 May 08, 04 Aug 08.
# In general, any string operation using 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).
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 occurrence of substring with replacement.
echo ${arrayZ[@]/fiv/XYZ} # one two three four XYZe XYZe
# ^ # Applied to all elements of the array.
# Replace all occurrences of substring.
echo ${arrayZ[@]//iv/YY} # one two three four fYYe fYYe
# Applied to all elements of the array.
# Delete all occurrences of substring.
# Not specifing a replacement defaults to 'delete' ...
echo ${arrayZ[@]//fi/} # one two three four ve ve
# ^^ # Applied to all elements of the array.
# Replace front-end occurrences of substring.
echo ${arrayZ[@]/#fi/XY} # one two three four XYve XYve
# ^ # Applied to all elements of the array.
# Replace back-end occurrences 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 "-----------------------------"
replacement() {
echo -n "!!!"
}
echo ${arrayZ[@]/%e/$(replacement)}
# ^ ^^^^^^^^^^^^^^
# on!!! two thre!!! four fiv!!! fiv!!!
# The stdout of replacement() is the replacement string.
# Q.E.D: The replacement action is, in effect, an 'assignment.'
echo "------------------------------------"
# Accessing the "for-each":
echo ${arrayZ[@]//*/$(replacement optional_arguments)}
# ^^ ^^^^^^^^^^^^^
# !!! !!! !!! !!! !!! !!!
# Now, if Bash would only pass the matched string
#+ to the function being called . . .
echo
exit 0
# Before reaching for a Big Hammer -- Perl, Python, or all the rest --
# recall:
# $( ... ) is command substitution.
# A function runs as a sub-process.
# A function writes its output (if echo-ed) to stdout.
# Assignment, in conjunction with "echo" and command substitution,
#+ can read a function's stdout.
# The name[@] notation specifies (the equivalent of) a "for-each"
#+ operation.
# Bash is more powerful than you think!