![tr -c '[a-zA-Z]' '\n' не заменяет все символы дополнения](https://rvso.com/image/76452/tr%20-c%20'%5Ba-zA-Z%5D'%20'%5Cn'%20%D0%BD%D0%B5%20%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D1%8F%D0%B5%D1%82%20%D0%B2%D1%81%D0%B5%20%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D1%8B%20%D0%B4%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F.png)
При написании скрипта я хотел заменить все символы, кроме альфа ([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
%