Удалите все специальные символы и регистр из строки в bash

Я пишу bash script, который должен анализировать имена файлов.

Ему нужно будет удалить все специальные символы (включая пробел): "!?.-_ и изменить все заглавные буквы на нижний регистр. Что-то вроде этого:

Some_randoM data1-A
More Data0

в

somerandomdata1a
moredata0

Я видел много вопросов для этого на разных языках программирования, но не в bash. Есть ли хороший способ сделать это?

Ответы

Ответ 1

cat yourfile.txt | tr -dc '[:alnum:]\n\r' | tr '[:upper:]' '[:lower:]'

Первый tr удаляет специальные символы. d означает delete, c означает дополнение (инвертировать набор символов). Таким образом, -dc означает удаление всех символов, кроме указанных. \n и \r включены для сохранения новых строк в стиле linux или windows, которые, как я предполагаю, вы хотите.

Второй переводит символы верхнего регистра в нижний регистр.

Ответ 2

Чистое решение BASH 4+:

$ filename='Some_randoM data1-A'
$ f=${filename//[^[:alnum:]]/}
$ echo "$f"
SomerandoMdata1A
$ echo "${f,,}"
somerandomdata1a

Функция для этого:

clean() {
    local a=${1//[^[:alnum:]]/}
    echo "${a,,}"
}

Попытайся:

$ clean "More Data0"
moredata0

Ответ 3

если вы используете подход mkelement0 и Dan Bliss. Вы также можете посмотреть регулярное выражение sed + POSIX.

cat yourfile.txt | sed 's/[^a-zA-Z0-9]//g'

Sed соответствует всем другим символам, которые не содержатся в скобках, кроме букв и цифр, и удаляют их.

Ответ 4

Я использовал tr для удаления любых символов, которые не являются частью [:print:] class

cat file.txt | tr -dc '[:print:]'

или

echo "..." | tr -dc '[:print:]'

Кроме того, вы можете захотеть | (pipe) вывод на od -c, чтобы подтвердить результат

cat file.txt | tr -dc '[:print:]' | od -c