Как я удаляю пробелы из переменных оболочки?

С большим количеством справки от @Deer Охотника я разбудил его и выполнение довольно быстро.

$ sudo apt-get install npm
$ sudo npm install --global less
$ sudo ln -s /usr/local/lib/node_modules/less/bin/lessc /usr/local/bin
15
20.09.2014, 23:10
5 ответов

В Bash вы можете использовать встроенные в Bash функции обработки строк. В этом случае вы можете:

> text="some text with spaces"
> echo "${text// /}"
sometextwithspaces

Подробнее об операторах обработки строк см. http://tldp.org/LDP/abs/html/string-manipulation.html

Однако ваша исходная стратегия тоже будет работать, ваш синтаксис немного не работает:

> text2=$(echo $text | tr -d ' ')
> echo $text2
sometextwithspaces
45
27.01.2020, 19:49

Просто измените текстовую переменную, как показано ниже.

text=$(echo $text | tr -d ' ')

Однако, если у нас есть управляющие символы, это может сломаться. Итак, согласно предложению Касперда, мы могли бы заключить его в двойные кавычки. Итак,

text="$(echo "$text" | tr -d ' ')"

будет лучшей версией.

5
27.01.2020, 19:49

Команда echo вообще не нужна, просто используйте Here String вместо:

text=$(tr -d ' ' <<< "$text")

Просто для любопытства я проверил, сколько времени такая тривиальная задача занимает для разных инструментов. Вот результаты, отсортированные от самых медленных к самым быстрым:

abc="some text with spaces"

$ time (for i in {1..1000}; do def=$(echo $abc | tr -d ' '); done)
0.76s user 1.85s system 52% cpu 4.976 total

$ time (for i in {1..1000}; do def=$(awk 'gsub(" ","")' <<< $abc); done)
1.09s user 2.69s system 88% cpu 4.255 total

$ time (for i in {1..1000}; do def=$(awk '$1=$1' OFS="" <<< $abc); done)
1.02s user 1.75s system 69% cpu 3.968 total

$ time (for i in {1..1000}; do def=$(sed 's/ //g' <<< $abc); done)
0.85s user 1.95s system 76% cpu 3.678 total

$ time (for i in {1..1000}; do def=$(tr -d ' ' <<< $abc); done)
0.73s user 2.04s system 85% cpu 3.244 total

$ time (for i in {1..1000}; do def=${abc// /}; done)
0.03s user 0.00s system 59% cpu 0.046 total

Чистая работа с оболочкой, безусловно, самая быстрая, что неудивительно, но что действительно впечатляет, так это то, что она более чем в 100 раз быстрее, чем самая медленная команда!

11
27.01.2020, 19:49
$ sed 's. ..g' <<< $text
namewithspace
4
27.01.2020, 19:49

специальный случай, когда вам нужна переменная, имеющая номер:

sh:

typeset -i A=B #or
typeset -i A="   23232"

ksh:

typeset -n A=B #or
typeset -n A="   23232"
2
27.01.2020, 19:49

Теги

Похожие вопросы