tr -c '' '\ n' не заменяет всех символов дополнения

Написав скрипт, я хотел заменить все символы, кроме альфа ([a-zA-Z]) на разрыв строки. По определению, при использовании флага -c (set complete) tr предполагается заменить все символы, которые не находятся в SET1, с символом, указанным в SET2. Тем не менее, он работает не так, как ожидалось … Попробуйте следующее:

echo '[[:lower:]]' | tr -c '[a-zA-Z]' '\n' 

Результат, который я получаю:

 [[ lower ]] 

Как видно, он заменяет столбцы, но не квадратные скобки, которые он должен заменить.

Может ли кто-нибудь прояснить это?

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 %