Подтвердить что ты не робот

Удаление не буквенно-цифровых символов с помощью sed

Я пытаюсь проверить некоторые входные данные, чтобы удалить набор символов. Допускаются только буквенно-цифровые символы плюс, точка, подчеркивание, дефис. Я протестировал выражение регулярного выражения [^\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, но ничего не было удалено.

4b9b3361

Ответ 1

Флаг -c (дополнение) может быть опцией

echo "Â10.41.89.50-._ " | tr -cd '[:alnum:]._-'

Ответ 2

Вместо этого вы можете использовать класс [: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.

Ответ 3

Well sed не будет поддерживать символы Unicode. Вместо этого используйте perl:

> s="Â10.41.89.50 "
> perl -pe 's/[^\w.-]+//g' <<< "$s"
10.41.89.50

Ответ 4

<`[[:alnum:][email protected]]`

Это сработало для меня отлично. Он сохранил все символы, которые я указал для моих целей.

Ответ 5

Исходя из ответа Анубхавы, этот работал для меня:

s/^[[:alnum:]]//g

Заменили все, кроме буквенно-цифровых символов, одним пробелом.

Запись: "." персонажи сохраняются

Ответ 6

Чтобы удалить все символы, кроме буквенно-цифровых и "-", используйте этот код:

echo "a b-1_2" | sed "s/[^[:alnum:]-]//g"