replaceend
Unlike Bourne Again Shell (bash), POSIX shell does not have a native find/replace function for replacing a pattern at the end of a given string with another. Below is an implementation written in native POSIX shell that is:
  • Faster than piping to awk, sed, perl, python, ruby, or other langauge
  • Compatible with bash and all other POSIX-compliant shells
  • Optimized to use ${parameter/%pattern[/string]} when bash is detected
1
1 #!/bin/sh
2
2 if [ "$BASH_VERSION" ]; then
3
3 replaceend() # $var_to_get $find $replace [$var_to_set]
4
4 {
5
5 eval ${4:-$1}=\"\${$1/%\$2${3:+/\$3}}\"
6
6 }
7
7 else
8
8 # NB: On FreeBSD, sh(1) runs this faster than bash(1) runs the above
9
9 replaceend() # $var_to_get $find $replace [$var_to_set]
10
10 {
11
11 eval local __string=\"\$1\" || return
12
12 case "$__string" in *$2)
13
13 __string="${__string%$2}$3"
14
14 esac
15
15 eval ${4:-$1}=\"\$__string\"
16
16 }
17
17 fi
18
18 eval echo \"before=[\$1]\"
19
19 replaceend "[email protected]"
20
20 eval echo \" after=[\${4:-$1}]\"
Copied!
Copy link