Удалите все специальные символы и регистр из строки в 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