tr -c '[a-zA-Z]' '\n' не заменяет все символы дополнения

tr -c '[a-zA-Z]' '\n' не заменяет все символы дополнения

При написании скрипта я хотел заменить все символы, кроме альфа ([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



%

Связанный контент