commit: 302084ee5cb39610378d1f963bb16adc7a78abbc
Author: Kerin Millar <kfm <AT> plushkava <DOT> net>
AuthorDate: Mon Jun 3 01:21:52 2024 +0000
Commit: Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Wed Jun 12 07:06:42 2024 +0000
URL:
https://gitweb.gentoo.org/proj/gentoo-functions.git/commit/?id=302084ee
Add the trim() function
As based on the implementation in Maarten Billemont's bashlib library.
Signed-off-by: Kerin Millar <kfm <AT> plushkava.net>
functions.sh | 16 ++++++++++++++++
test-functions | 29 +++++++++++++++++++++++++++++
2 files changed, 45 insertions(+)
diff --git a/functions.sh b/functions.sh
index 1548bd0..30c2447 100644
--- a/functions.sh
+++ b/functions.sh
@@ -513,6 +513,22 @@ srandom()
srandom
}
+#
+# Trims leading and trailing whitespace from one or more lines. If at least one
+# parameter is provided, each positional parameter shall be considered as a
line
+# to be processed. Otherwise, the lines to be processed shall be read from the
+# standard input. The trimmed lines shall be printed to the standard output.
+#
+trim()
+{
+ if [ "$#" -gt 0 ]; then
+ printf '%s\n' "$@"
+ else
+ cat
+ fi |
+ sed -e 's/^[[:space:]]\{1,\}//' -e 's/[[:space:]]\{1,\}$//'
+}
+
#
# Prints a diagnostic message prefixed with the basename of the running script.
#
diff --git a/test-functions b/test-functions
index 400ddb2..bbb74f1 100755
--- a/test-functions
+++ b/test-functions
@@ -456,6 +456,34 @@ test_newest() {
iterate_tests 4 "$@"
}
+test_trim() {
+ set -- \
+ eq 0 '' '' \
+ eq 0 ' ' '' \
+ eq 0 ' ' '' \
+ eq 0 ' X' 'X' \
+ eq 0 ' X' 'X' \
+ eq 0 'X ' 'X' \
+ eq 0 ' X Y' 'X Y' \
+ eq 0 ' X Y' 'X Y' \
+ eq 0 'X Y ' 'X Y' \
+ eq 0 'X Y ' 'X Y' \
+ eq 0 "$(printf ' \tX')" 'X' \
+ eq 0 "$(printf ' \tX\t ')" 'X' \
+ eq 0 "$(printf 'X\t ')" 'X' \
+ eq 0 "$(printf ' \tX Y')" 'X Y' \
+ eq 0 "$(printf ' \tX Y\t ')" 'X Y' \
+ eq 0 "$(printf 'X Y\t ')" 'X Y'
+
+ callback() {
+ shift
+ test_description="trim $(_print_args "$1") (expecting
$(_print_args "$2"))"
+ test "$(trim "$1")" = "$2"
+ }
+
+ iterate_tests 4 "$@"
+}
+
iterate_tests() {
slice_width=$1
shift
@@ -518,6 +546,7 @@ test_die || rc=1
test_edo || rc=1
test_srandom || rc=1
test_newest || rc=1
+test_trim || rc=1
cleanup_tmpdir