LINUX.ORG.RU

как работает комманда expand из coreutils?

 


0

2

Добрый день.

Помогите разобраться как же работает комманда expand из coreutils. В официальном гайде (Core GNU utilities for version 8.28, 1 September 2017) сказанно: Заменяет все символы «tab» необходимым количеством пробелов, по умолчанию один символ «tab» заменяется восемью символами пробела (1tab=8spaces). И действительно все так: expand text.txt #заменит все табы 8-мью пробелами

Дальше, в этом же гайде сказано, что есть такой ключ --tabs, который (если --tabs=одно_число) позволяет установить на сколько пробелов заменить один символ tab. Действительно, если expand --tabs=1 text.txt #заменит все табы одним пробелом.

Непонятки начинаются дальше, когда --tabs=2 или --tabs=3 и.т.д:

[1@localhost ~]$ cat text.txt #пример1. Исходный файл с табами
9       plum
3       banana
1       apple
[1@localhost ~]$ expand --tabs=1 text.txt #пример2. Все ОК
9 plum
3 banana
1 apple
[1@localhost ~]$ expand --tabs=2 text.txt #пример3.Почему 1 пробел, ведь --tabs=2 ?
9 plum
3 banana
1 apple
[1@localhost ~]$ expand --tabs=3 text.txt #пример4. Почему 2 пробел, ведь --tabs=3 ?
9  plum
3  banana
1  apple
[1@localhost ~]$ expand --tabs=4 text.txt #пример5. здесь 3
9   plum
3   banana
1   apple

Как же он все-таки работает? Заранее спасибо.

Таб не равносилен вставке n пробелов. В строке есть позиции табуляции. Например, при ширине таба 8 это нулевой, восьмой, шестнадцатый, двадцать четвёртый и т.д. символы. Если мы находимся в столбце x, то таб шириной 8 сдвигает не в x+8, а до ближайшей позиции табуляции после x.

В этих примерах именно это и происходит. В первом символе цифра, потом идёт таб, который сдвигает до четвёртого (в последнем примере), вставляется для этого три пробела.

gentoo_root ★★★★★
()
Ответ на: комментарий от gentoo_root

Ясно, теперь я знаю как работает tab, раньше как-то не задумывался даже, спасибо. Окей, руководствуясь ваше логикой, стали понятными примеры3-5. Но почему тогда в примере 2 вообще существуют пробелы, где --tabs=1? Сдвигать с позиции 0-там цифра до позиции 1-там уже символ и как итог полное отсутствие пробелов.

alexey107
() автор топика
Ответ на: комментарий от alexey107

Но почему тогда в примере 2 вообще существуют пробелы, где --tabs=1?

Если взять размер таба 8, то из позиций 0, 1, 2, 3, 4, 5, 6, 7 таб передвинет в позицию 8, а из позиции 8 — уже в 16. То есть если мы стоим на позиции табуляции и нажимаем таб, то переходим в следующую. При ширине таба 1 в каждом столбце будет позиция табуляции, и это означает, что таб будет переходить к следующему символу, т.е. будет вставляться пробел.

gentoo_root ★★★★★
()
Ответ на: комментарий от alexey107

Но почему тогда в примере 2 вообще существуют пробелы, где --tabs=1?

Табуляция всегда вставляет распорку, размер в пробелах зависит от ширины табуляции и от номера позиции в строке, но один пробел должен быть точно. При ширине табуляции=1 одна табуляция = один пробел вытекает логически.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

Отлично, теперь ясно. Про «распорку» мне особенно понравилось!!!))) Всем спасибо, низкий поклон!!!

alexey107
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.