Как удалить дополнительные пробелы в bash? - программирование
Подтвердить что ты не робот

Как удалить дополнительные пробелы в bash?

Как удалить лишние пробелы в переменной HEAD?

HEAD="    how to  remove    extra        spaces                     "

Результат:

how to remove extra spaces
4b9b3361

Ответ 1

Попробуйте следующее:

echo "$HEAD" | tr -s " "

или, возможно, вы хотите сохранить его в переменной:

NEWHEAD=$(echo "$HEAD" | tr -s " ")

Обновление

Чтобы удалить ведущие и конечные пробелы, сделайте следующее:

NEWHEAD=$(echo "$HEAD" | tr -s " ")
NEWHEAD=${NEWHEAD%% }
NEWHEAD=${NEWHEAD## }

Ответ 2

Использование awk:

$ echo "$HEAD" | awk '$1=$1'
how to remove extra spaces

Ответ 3

Воспользуйтесь эффектами разделения слов, не ссылающимися на вашу переменную

$ HEAD="    how to  remove    extra        spaces                     "
$ set -- $HEAD
$ HEAD=$*
$ echo ">>>$HEAD<<<"
>>>how to remove extra spaces<<<

Если вы не хотите использовать позиционные параметры, используйте массив

ary=($HEAD)
HEAD=${ary[@]}
echo "$HEAD"

Один опасный побочный эффект не цитирования заключается в том, что расширение имени файла будет в игре. Поэтому сначала выключите его и снова включите его:

$ set -f
$ set -- $HEAD
$ set +f

Ответ 4

Эта лошадь еще не совсем мертва: пусть будет бить ее! *

Чтение в массив

Другие люди упомянули read, но так как использование некорректного расширения может вызвать нежелательные расширения, все ответы, использующие его, можно считать более или менее одинаковыми. Вы можете сделать

set -f
read HEAD <<< $HEAD
set +f

или вы могли бы сделать

read -a HEAD <<< "$HEAD"
HEAD="${HEAD[*]}"

Расширенное Globbing с расширением параметра

$ shopt -s extglob
$ HEAD="${HEAD//+( )/ }" HEAD="${HEAD# }" HEAD="${HEAD% }"
$ printf '"%s"\n' "$HEAD"
"how to remove extra spaces"

* Никаких лошадей на самом деле не пострадали - это была всего лишь метафора для получения шести + разнообразных ответов на простой вопрос.

Ответ 5

Вот как бы я сделал это с sed:

string='    how to  remove    extra        spaces                     '
echo "$string" | sed -e 's/  */ /g' -e 's/^ *\(.*\) *$/\1/'

=> how to remove extra spaces   # (no spaces at beginning or end)

Первое выражение sed заменяет любые группы из более чем одного пространства на единое пространство, а второе выражение удаляет любые конечные или ведущие пробелы.

Ответ 6

Попробуйте следующее:

echo '    how to  remove    extra        spaces                     ' | sed 's/^ *//g' | sed 's/$ *//g' | sed 's/   */ /g'

или

HEAD="    how to  remove    extra        spaces                     "
HEAD=$(echo "$HEAD" | sed 's/^ *//g' | sed 's/$ *//g' | sed 's/   */ /g')

Ответ 7

echo -e " abc \t def "|column -t|tr -s " "

column -t будет:

  1. убрать пробелы в начале и в конце строки
  2. конвертировать вкладки в пробелы

tr -s " " несколько пробелов в один пробел


Кстати, чтобы увидеть весь вывод, вы можете использовать cat - -A: показывает все пространственные символы, включая вкладки и EOL:

echo -e " abc \t def "|cat - -A

вывод: abc ^I def $

echo -e " abc \t def "|column -t|tr -s " "|cat - -A

вывод: abc def$

Ответ 8

Переменная echo без кавычек делает то, что вы хотите:

HEAD="    how to  remove    extra        spaces      "
echo $HEAD

вывод: how to remove extra spaces

Ответ 9

Я бы использовал tr для удаления лишних пробелов и xargs для обрезки спереди и сзади.

TEXT="     This          is  some                             text   "
echo $(echo $TEXT | tr -s " " | xargs)

# [...]$ This is some text