Как обрезать пробелы из переменной Bash?

Хорошее объяснение этого можно найти здесь здесь . Суммировать: число в скобке в int (N) часто путается максимальным размером, разрешенным для столбца, как это имеет место в случае varchar (N). Но это не относится к типам данных Integer - число N в скобках не является максимальным размером для столбца, а просто параметром, указывающим MySQL, какую ширину отображает столбец, когда данные таблицы просматриваются через MySQL console (когда вы используете атрибут ZEROFILL). Число в скобках подскажет MySQL, сколько нулей для ввода входящих целых чисел. Например: если вы используете ZEROFILL в столбце, который установлен в INT (5), а число 78 вставлено, MySQL будет заполнять это значение нулями до тех пор, пока число не удовлетворит число в скобках. т. е. 78 станет 00078 и 127 станет 00127. Подводя итог: число в скобках используется для показа. В некотором смысле, число в скобках является бесполезным, если вы не используете атрибут ZEROFILL. Таким образом, размер для int останется таким же, например, -2147483648 до 2147483648 для подписанных и 0 to 4294967295 для неподписанных (~ 2,15 миллиарда и 4,2 миллиарда долларов), одна из причин, по которым разработчики не знают историю, стоящую за номером N в скобках, поскольку это вряд ли влияет на базу данных, если она содержит более 2 миллиардов строк), а в байтах - 4 байта.

Для получения дополнительной информации о размере / диапазоне типов Integer см. Руководство по MySQL

808
задан 4 revs, 3 users 79% 20 June 2018 в 05:55
поделиться

11 ответов

Я всегда делал его с sed

  var=`hg st -R "$path" | sed -e 's/  *$//'`

, Если существует более изящное решение, я надеюсь, что кто-то отправляет его.

22
ответ дан Paul Tomblin 20 June 2018 в 05:55
поделиться

Bash имеет функцию, названную расширение параметра , который, среди прочего, позволяет строковую замену на основе так называемого шаблоны (шаблоны напоминают регулярные выражения, но существуют принципиальные различия и ограничения). [исходная строка flussence: Bash имеет регулярные выражения, но они хорошо скрыты:]

следующее демонстрирует, как удалить весь пробел (даже от внутренней части) от значения переменной.

$ var='abc def'
$ echo "$var"
abc def
# Note: flussence's original expression was "${var/ /}", which only replaced the *first* space char., wherever it appeared.
$ echo -n "${var//[[:space:]]/}"
abcdef
70
ответ дан 2 revs, 2 users 67%user42092 20 June 2018 в 05:55
поделиться

Можно удалить новые строки с tr:

var=`hg st -R "$path" | tr -d '\n'`
if [ -n $var ]; then
    echo $var
done
20
ответ дан Adam Rosenfield 20 June 2018 в 05:55
поделиться

Я видел сценарии просто использовать переменное присвоение, чтобы сделать задание:

$ xyz=`echo -e 'foo \n bar'`
$ echo $xyz
foo bar

Пробел автоматически объединяется и обрезается. Нужно остерегаться метасимволов оболочки (потенциальный инжекционный риск).

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

if [ -n "$var" ]; then

начиная с чего-то как-o или другое содержание в переменной мог исправить Ваши тестовые аргументы.

8
ответ дан MykennaC 20 June 2018 в 05:55
поделиться

Используйте AWK:

echo $var | awk '{gsub(/^ +| +$/,"")}1'
6
ответ дан 22 November 2019 в 21:11
поделиться

Удалите один начальный и один конечный пробелы

trim()
{
    local trimmed="$1"

    # Strip leading space.
    trimmed="${trimmed## }"
    # Strip trailing space.
    trimmed="${trimmed%% }"

    echo "$trimmed"
}

Например:

test1="$(trim " one leading")"
test2="$(trim "one trailing ")"
test3="$(trim " one leading and one trailing ")"
echo "'$test1', '$test2', '$test3'"

Вывод:

'one leading', 'one trailing', 'one leading and one trailing'

Удалите из все начальные и конечные пробелы

trim()
{
    local trimmed="$1"

    # Strip leading spaces.
    while [[ $trimmed == ' '* ]]; do
       trimmed="${trimmed## }"
    done
    # Strip trailing spaces.
    while [[ $trimmed == *' ' ]]; do
        trimmed="${trimmed%% }"
    done

    echo "$trimmed"
}

Например:

test4="$(trim "  two leading")"
test5="$(trim "two trailing  ")"
test6="$(trim "  two leading and two trailing  ")"
echo "'$test4', '$test5', '$test6'"

Вывод:

'two leading', 'two trailing', 'two leading and two trailing'
50
ответ дан 22 November 2019 в 21:11
поделиться

Вы можете использовать старый добрый tr . Например, это возвращает количество измененных файлов в репозитории git без пробелов.

MYVAR=`git ls-files -m|wc -l|tr -d ' '`
10
ответ дан 22 November 2019 в 21:11
поделиться

Если в Bash включены расширенные функции сопоставления с образцом ( shopt -s extglob ), вы можете использовать следующее:

{trimmed ## * ()}

, чтобы удалить произвольное количество начальных пробелов .

24
ответ дан 22 November 2019 в 21:11
поделиться

Определим переменную, содержащую ведущие, концевые и промежуточные пробелы:

FOO=' test test test '
echo -e "FOO='${FOO}'"
# > FOO=' test test test '
echo -e "length(FOO)==${#FOO}"
# > length(FOO)==16

Как удалить все пробелы (обозначенные [:space:] в tr):

FOO=' test test test '
FOO_NO_WHITESPACE="$(echo -e "${FOO}" | tr -d '[:space:]')"
echo -e "FOO_NO_WHITESPACE='${FOO_NO_WHITESPACE}'"
# > FOO_NO_WHITESPACE='testtesttest'
echo -e "length(FOO_NO_WHITESPACE)==${#FOO_NO_WHITESPACE}"
# > length(FOO_NO_WHITESPACE)==12

Как удалить только ведущие пробелы:

FOO=' test test test '
FOO_NO_LEAD_SPACE="$(echo -e "${FOO}" | sed -e 's/^[[:space:]]*//')"
echo -e "FOO_NO_LEAD_SPACE='${FOO_NO_LEAD_SPACE}'"
# > FOO_NO_LEAD_SPACE='test test test '
echo -e "length(FOO_NO_LEAD_SPACE)==${#FOO_NO_LEAD_SPACE}"
# > length(FOO_NO_LEAD_SPACE)==15

Как удалить только пробелы в конце страницы:

FOO=' test test test '
FOO_NO_TRAIL_SPACE="$(echo -e "${FOO}" | sed -e 's/[[:space:]]*$//')"
echo -e "FOO_NO_TRAIL_SPACE='${FOO_NO_TRAIL_SPACE}'"
# > FOO_NO_TRAIL_SPACE=' test test test'
echo -e "length(FOO_NO_TRAIL_SPACE)==${#FOO_NO_TRAIL_SPACE}"
# > length(FOO_NO_TRAIL_SPACE)==15

Как удалить и ведущие, и концевые пробелы - цепочка seds:

FOO=' test test test '
FOO_NO_EXTERNAL_SPACE="$(echo -e "${FOO}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
echo -e "FOO_NO_EXTERNAL_SPACE='${FOO_NO_EXTERNAL_SPACE}'"
# > FOO_NO_EXTERNAL_SPACE='test test test'
echo -e "length(FOO_NO_EXTERNAL_SPACE)==${#FOO_NO_EXTERNAL_SPACE}"
# > length(FOO_NO_EXTERNAL_SPACE)==14

Альтернативно, если ваш bash поддерживает это, вы можете заменить echo -e "${FOO}" | sed ... на sed ... <<<${FOO}, примерно так (для пробельных символов в конце):

FOO_NO_TRAIL_SPACE="$(sed -e 's/[[:space:]]*$//' <<<${FOO})"
973
ответ дан 22 November 2019 в 21:11
поделиться

Существует решение, которое использует только встроенные средства Bash, называемые подстановочными знаками :

var="    abc    "
# remove leading whitespace characters
var="${var#"${var%%[![:space:]]*}"}"
# remove trailing whitespace characters
var="${var%"${var##*[![:space:]]}"}"   
echo "===$var==="

Вот то же самое, заключенное в функцию:

trim() {
    local var="$*"
    # remove leading whitespace characters
    var="${var#"${var%%[![:space:]]*}"}"
    # remove trailing whitespace characters
    var="${var%"${var##*[![:space:]]}"}"   
    echo -n "$var"
}

Вы передаете строку, чтобы обрезаны в цитируемой форме. например:

trim "   abc   "

В этом решении хорошо то, что оно будет работать с любой POSIX-совместимой оболочкой.

Ссылка

321
ответ дан 22 November 2019 в 21:11
поделиться

Удаление пробелов в один пробел:

(text) | fmt -su
2
ответ дан 22 November 2019 в 21:11
поделиться
Другие вопросы по тегам:

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