Al escribir un script, quería reemplazar todos los caracteres excepto alfa ([a-zA-Z]) con un salto de línea. Por definición, cuando se utiliza el indicador -c (establecer complemento), se supone que tr reemplaza todos los caracteres que no están en SET1 con el carácter especificado en SET2. Sin embargo, no funciona como se esperaba... Prueba esto:
echo '[[:lower:]]' | tr -c '[a-zA-Z]' '\n'
Salida que obtengo:
[[
lower
]]
Como puede verse, reemplaza las columnas pero no los corchetes, que se supone que deben reemplazar.
¿Alguien puede aclarar esto?
Respuesta1
tr
no interpreta clases de caracteres en ese estilo de expresiones regulares.
[a-zA-Z]
se interpreta como un conjunto de [
, el rango de caracteres desde a
hasta z
y ]
.
Por lo tanto su complemento es el conjunto de caracteres que incluye todos los caracteres pero [
, el rango de caracteres desde a
hasta z
y ]
.
Por eso [
y ]
no son reemplazados.
Para reemplazar cualquier carácter no alfabético, simplemente especifique a-zA-Z
como complemento del conjunto a reemplazar:
echo '[[:lower:]]' | tr -c 'a-zA-Z' '\n'
% echo '[[:lower:]]' | tr -c 'a-zA-Z' '\n'
lower
%