Ответ 1
Флаг tr -c
(дополнение) может быть опцией
echo "Â10.41.89.50-._ " | tr -cd '[:alnum:]._-'
Я пытаюсь проверить некоторые входные данные, чтобы удалить набор символов. Допускаются только буквенно-цифровые символы плюс, точка, подчеркивание, дефис. Я протестировал выражение регулярного выражения [^\w.-]
здесь http://gskinner.com/RegExr/, и оно соответствует тому, что я хочу удалить, поэтому я не уверен, почему sed
возвращает обратное. Что мне не хватает?
Моя конечная цель - ввести "Â10.41.89.50 "
и получить "10.41.89.50
".
Я пробовал:
echo "Â10.41.89.50 " | sed s/[^\w.-]//g
возвращает Â...
echo "Â10.41.89.50 " | sed s/[\w.-]//g
и echo "Â10.41.89.50 " | sed s/[\w^.-]//g
возвращают Â10418950
Я попытался найти ответ здесь Пропустить/удалить не-ascii символ с помощью sed, но ничего не было удалено.
Флаг tr -c
(дополнение) может быть опцией
echo "Â10.41.89.50-._ " | tr -cd '[:alnum:]._-'
Вместо этого вы можете использовать класс [:alpha:]
:
echo "Â10.41.89.50 " | sed "s/[[:alpha:].-]//g"
должен работать. Если нет, вам может потребоваться изменить локальные настройки.
С другой стороны, если вы хотите сохранить только цифры, дефисы и период::
echo "Â10.41.89.50 " | sed "s/[^[:digit:].-]//g"
Если ваша строка находится в переменной, вы можете использовать чистые расширения bash и для этого:
$ dirty="Â10.41.89.50 "
$ clean=${dirty//[^[:digit:].-]/}
$ echo "$clean"
10.41.89.50
или
$ dirty="Â10.41.89.50 "
$ clean=${dirty//[[:alpha:]]/}
$ echo "$clean"
10.41.89.50
Вы также можете посмотреть ответ 1_CR
.
Well sed не будет поддерживать символы Unicode. Вместо этого используйте perl
:
> s="Â10.41.89.50 "
> perl -pe 's/[^\w.-]+//g' <<< "$s"
10.41.89.50
<`[[:alnum:][email protected]]`
Это сработало для меня отлично. Он сохранил все символы, которые я указал для моих целей.
Исходя из ответа Анубхавы, этот работал для меня:
s/^[[:alnum:]]//g
Заменили все, кроме буквенно-цифровых символов, одним пробелом.
Запись: "." персонажи сохраняются
Чтобы удалить все символы, кроме буквенно-цифровых и "-", используйте этот код:
echo "a b-1_2" | sed "s/[^[:alnum:]-]//g"