mirror of https://github.com/tLDP/LDP
119 lines
3.7 KiB
Bash
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!
|