Я бы просто использовал sed:
function trim
{
echo "$1" | sed -n '1h;1!H;${;g;s/^[ \t]*//g;s/[ \t]*$//g;p;}'
}
a) Пример использования строки из одной строки
string=' wordA wordB wordC wordD '
trimmed=$( trim "$string" )
echo "GIVEN STRING: |$string|"
echo "TRIMMED STRING: |$trimmed|"
Выход:
GIVEN STRING: | wordA wordB wordC wordD |
TRIMMED STRING: |wordA wordB wordC wordD|
б) Пример использования многострочной строки
string=' wordA
>wordB<
wordC '
trimmed=$( trim "$string" )
echo -e "GIVEN STRING: |$string|\n"
echo "TRIMMED STRING: |$trimmed|"
Выход:
GIVEN STRING: | wordAA
>wordB<
wordC |
TRIMMED STRING: |wordAA
>wordB<
wordC|
c) Конечная нота:
Если вам не нравится использовать функцию, для однострочной строки вы можете просто использовать команду «легче запомнить», например:
echo "$string" | sed -e 's/^[ \t]*//' | sed -e 's/[ \t]*$//'
Пример: * * тысяча двадцать-восемь
echo " wordA wordB wordC " | sed -e 's/^[ \t]*//' | sed -e 's/[ \t]*$//'
Выход:
wordA wordB wordC
Использование вышеприведенного для многострочных строк также будет работать , но, пожалуйста, обратите внимание, что оно также сократит любой трейлинг / лидирующий внутренний множественный пробел, как заметил GuruM в комментариях
string=' wordAA
>four spaces before<
>one space before< '
echo "$string" | sed -e 's/^[ \t]*//' | sed -e 's/[ \t]*$//'
Выход:
wordAA
>four spaces before<
>one space before<
Так что, если вы не возражаете, оставьте эти пробелы, пожалуйста, используйте функцию в начале моего ответа!
d) ОБЪЯСНЕНИЕ синтаксиса sed "найти и заменить" для многострочных строк, используемых внутри функции trim:
sed -n '
# If the first line, copy the pattern to the hold buffer
1h
# If not the first line, then append the pattern to the hold buffer
1!H
# If the last line then ...
$ {
# Copy from the hold to the pattern buffer
g
# Do the search and replace
s/^[ \t]*//g
s/[ \t]*$//g
# print
p
}'