При написании скрипта я хотел заменить все символы, кроме альфа ([a-zA-Z]), на перенос строки. По определению, при использовании флага -c (дополнение набора) tr должен заменить все символы, которых нет в SET1, на символ, указанный в SET2. Тем не менее, это не работает так, как ожидалось... Попробуйте это:
echo '[[:lower:]]' | tr -c '[a-zA-Z]' '\n'
На выходе я получаю:
[[
lower
]]
Как можно заметить, он заменяет столбцы, но не квадратные скобки, которые он должен заменять.
Кто-нибудь может это прояснить?
решение1
tr
не интерпретирует классы символов в этом стиле регулярных выражений.
[a-zA-Z]
интерпретируется как набор [
, диапазон символов от a
до z
и ]
.
Поэтому его дополнением является набор символов, включающий все символы, кроме [
, диапазон символов от a
до z
и ]
.
Вот почему [
и ]
не заменяются.
Чтобы заменить любой неалфавитный символ, просто укажите его a-zA-Z
в качестве дополнения к набору, который необходимо заменить:
echo '[[:lower:]]' | tr -c 'a-zA-Z' '\n'
% echo '[[:lower:]]' | tr -c 'a-zA-Z' '\n'
lower
%