удалить отдельные символы из переменной, используя bash

123

Я хочу проанализировать переменную (в моем случае это версия комплекта разработчика), чтобы сделать ее .свободной ( ). Если version='2.3.3'желаемый результат есть 233.

Я попробовал, как показано ниже, но его нужно .заменить другим персонажем, дающим мне 2_3_3. Было бы хорошо, если tr . ''бы сработало.

  1 VERSION='2.3.3' 
  2 echo "2.3.3" | tr . _
prayagupd
источник
10
Нет, это не требует: echo "2.3.3" | tr -d ..
Манатворк
1
@ Manatwork Отлично, это работает. Вы можете опубликовать это как ответ. Спасибо
praagagupd
1
Много хороших ответов. Но если я смогу угадать цель, будьте предупреждены о 2.11.3 и 2.1.13 ... ;-) Подумайте о добавлении нулей к числам.
Rmano
1
@Rmano Ты имеешь в виду что-то вроде VERSION='2.30.3100'? Независимо от того, что только что .удалено со всеми ответами здесь.
prayagupd
2
@PrayagUpd --- Я просто имел в виду, что если вы будете использовать число после преобразования для сравнения (например, «эта версия новее или та же»), вам следует позаботиться о таких случаях, как 2.11.3 и 2.1.13 - - они кажутся такими же после удаления точек, но очевидно, что 2.11.3 новее. Кроме того, 2.11.3 новее, чем 2.1.14, но сравнение 2113 и 2114 приведет к неправильному ответу. Я помню ошибку где-то для этого ...
Rmano

Ответы:

136

Нет необходимости выполнять внешнюю программу. Манипуляцииbash со строками могут справиться с этим (также доступно в ksh(откуда это происходит) и zsh):

$ VERSION='2.3.3'
$ echo "${VERSION//.}"
233

(В руководствах по этим оболочкам вы можете найти это в разделе расширения параметров.)

manatwork
источник
19
Для более подробной информации синтаксис вышеприведенного ответа таков: ${string//substring/replacement}очевидно, отсутствие последней косой черты и строки замены интерпретируются как удаление . Смотрите здесь .
sherrellbc
5
Правильно, man bashэто ясно сказано в разделе « Расширение параметров оболочки »: « ${parameter/pattern/string}(…) Если строка пуста, совпадения шаблона удаляются, а /следующий шаблон может быть опущен».
manatwork
1
Моя проблема заключалась в том, что номер версии был таким, "1.0.0"и я хотел только номер, поэтому следуйте тому, что предложил @manatwork, я изменил: "${VERSIONNUM//'"'}"однако я вставляю даже ' ' потому, что в противном случае он не распознал бы ""подобную строку для взлета.
Alexiscanny
1
@Alexiscanny, ты имеешь в виду, что буквальное значение "присутствует в значении? Я боюсь, что это считается новым вопросом, но попробуйте просто избежать двойной цитаты: "${VERSIONNUM//\"}" pastebin.com/3ECDtkwH
manatwork
1
Superb !! работает -ashтоже!
Fr0zenFyr
88

По хронологическому порядку:

тр / СЕПГ

echo "$VERSION" | tr -d .
echo "$VERSION" | sed 's/\.//g'

CSH / Tcsh

echo $VERSION:as/.//

POSIX оболочки:

set -f
IFS=.
set -- $VERSION
IFS=
echo "$*"

ksh / zsh / bash / yash (и busybox ashпри сборке с ASH_BASH_COMPAT)

echo "${VERSION//.}"

ЗШ

echo $VERSION:gs/./
Стефан Шазелас
источник
1
tr -d удалил даже один символ из набора. Для Ex я хочу удалить DCC_ из "DCC_VersionD", он удаляет DCC и D. Ожидаемый вывод: VersionD. Фактический вывод: версия. Сед работал как шарм. :) спасибо за пост.
Кайле
20

В дополнение к успешным ответам уже существует. То же самое может быть достигнуто trс помощью --deleteопции.

echo "2.3.3" | tr --delete .

Который будет выводить: 233

DAZ
источник
6
на macos --deleteфлаг не распознается, но вы можете использовать -dвместо него
Anentropic
6

вы должны попробовать sedвместо

sed 's/\.//g'

fduff
источник
4
echo "$VERSION" | tr -cd [:digit:]

Это будет возвращать только цифры, независимо от того, какие другие символы присутствуют

user2796674
источник
4

Perl

$ VERSION='2.3.3'                                     
$ perl -pe 's/\.//g' <<< "$VERSION"           
233

питон

$ VERSION='2.3.3'                                     
$ python -c 'import sys;print sys.argv[1].replace(".","")' "$VERSION"
233

Если $VERSIONтолько содержит цифры и точки, мы можем сделать что-то еще короче:

$ python -c 'print "'$VERSION'".replace(".","")'
233

(будьте осторожны, это уязвимость внедрения кода, хотя $VERSIONможет содержать любой символ).

AWK

$ VERSION='2.3.3'
$ awk 'BEGIN{gsub(/\./,"",ARGV[1]);print ARGV[1]}' "$VERSION"
233

Или это:

$ awk '{gsub(/\./,"")}1' <<< "$VERSION"
233
Сергей Колодяжный
источник