Если вы хотите сжать «пробел», вам нужно использовать предопределенные наборы символов tr «: blank:» (горизонтальная табуляция и пробел) или «: space:» (вертикальный пробел):
/bin/echo -e "val1\t\tval2 val3" | tr -s "[:blank:]"
Примеры были запущены на Red Hat 5 (GNU tr).
В моем случае я хотел нормализовать все пробелы в одном пробеле, чтобы я мог положиться на пространство в качестве разделителя.
Как указано во втором комментарии Дастробу, я пропустил формулировку на странице руководства:
-s uses the last specified SET, and occurs after translation or deletion.
Это позволяет нам исключить первый тр. Кудо Скотту за терпение перед лицом моей глупости.
До этого разбирал порт из конфига Redis. файл:
grep "^port" $redisconf | tr "[:blank:]" " " | tr -s "[:blank:]" | cut -d" " -f2
После, с SET2, указанным с помощью squeeze:
grep "^port" $redisconf | tr -s "[:blank:]" " " | cut -d" " -f2
Выход:
6379
Для более подробной информации о нюансах пробелов
Продемонстрируйте, где одно только сжатие не срабатывает, когда задействованы последовательные смешанные символы, попадающие в класс символов [: blank:]:
/usr/bin/printf '%s \t %s' id myname | tr -s "[:blank:]" | od -cb
0000000 i d \t m y n a m e
151 144 040 011 040 155 171 156 141 155 145
0000013
Примечание: два моих строковых поля в формате printf разделены 1 пробелом, 1 табуляцией, 1 пробелом. После сжатия эта последовательность все еще существует. На выходе октального дампа это представлено последовательностью ascii 040 011 040.