LINUX.ORG.RU

Обратная совместимость expand (coreutils 8.31 -> 8.26)

 ,


0

1

Привет, комрады!

Обрабатываю строки такого типа:

 81.22.45.65 ttl: 245 last_seen: 13805894152 oldest_pkt: 1 13805894152

командой expand -t 1,17,26,/1. На новой версии coreutils вывод отображается ожидаемо хорошо, а старая жалуется:
expand: tab size contains invalid character(s): '/1'. Если убрать последний оператор /1, то все табы тупо становятся одним пробелом.

Как раньше задавался список позиций табов с указанием ширины?
Спасибо!

★★
Ответ на: комментарий от debugger

И что там полезного? Посмотрел в архиве coreutils.texi

If only one tab stop is given, set the tabs @var{tab1} spaces apart
(default is 8).  Otherwise, set the tabs at columns @var{tab1},
@var{tab2}, @dots{} (numbered from 0), and replace any tabs beyond the
last tab stop given with single spaces.  Tab stops can be separated by
blanks as well as by commas.

Из этого я понимаю, что для версии 8.26 синтаксис expand -t 1,17,26 правильный, но это не так – на табуляцию влияет только первая цифра в списке – она применяется только к первому табу, остальные при этом заменяются одним пробелом.

Это баг или я использую неправильный синтаксис?

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

И что там полезного?

Для тебя, видимо, ничего.

А вообще, наличие исходников всех предыдущих версий с 2003 года позволяет ответить на вопрос «Как раньше задавался список позиций табов с указанием ширины?», а не вопрошать об этом на форуме. Для этого даже не надо читать именно исходники — можно извлечь и сравнить, например, маны разных версий.

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

Маны внимательно читал. По этому параметру в версии 8.26 есть следующее:

-t, --tabs=LIST
    use comma separated list of explicit tab positions

Есть ещё expand --help

-t, --tabs=LIST     use comma separated list of explicit tab positions

То же самое. Это всё что есть из доков.

Я не умею читать исходники Си, поэтому пришёл спросить на форум. @debugger, пожалуйста, больше не заходи в эту тему – …. кому-нибудь другому мозги.

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

Победа!
Методом научного тыка разобрался: перепробовал случаи с разным количеством табов, включая строки, начинающиеся с таба – оказалось, что expand конкретно с моим списком сбоит (баг, сохраняющийся в самой новой версии coreutils включительно).

У моего списка остановки рассчитываются, как если бы первый таб был восемью пробелами (т. е. ко всем последующим остановкам +8 от желаемого итогового расположения полей на строке). В остальных случаях достаточно указать остановки, подразумевая уже произведённые замены в строке.

Пример моей строки (из списка ip адресов, составленного модулем xt_recent; места табов в исходной строке отмечены {\t}):

{\t}185.176.27.2{\t}ttl: 243{\t}last_seen: 13885884858 oldest_pkt: 1 13885884858

Поэтому для выравнивания полей использую команду expand -t 1,31,40.

Надеюсь, решение пригодится тому, кто столкнётся с подобным багом.

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

То же самое. Это всё что есть из доков.

Прям то же самое? И всё-всё, и больше в доках ничего нет?

А вот что вижу я. Вот кусок доки на версию 8.31:

‘-t tab1[,tab2]…’
‘--tabs=tab1[,tab2]…’

    If only one tab stop is given, set the tabs tab1 spaces apart (default is 8). Otherwise, 
    set the tabs at columns tab1, tab2, … (numbered from 0), and replace any tabs beyond the 
    last tab stop given with single spaces.

    Tab stops can be separated by blanks as well as by commas.

    As a GNU extension the last tab specified can be prefixed with a ‘/’ to indicate a tab size 
    to use for remaining positions. For example, ‘--tabs=2,4,/8’ will set tab stops at position 
    2 and 4, and every multiple of 8 after that.

    Also the last tab specified can be prefixed with a ‘+’ to indicate a tab size to use for 
    remaining positions, offset from the final explicitly specified tab stop. For example, to 
    ignore the 1 character gutter present in diff output, one can specify a 1 character offset 
    using ‘--tabs=1,+8’, which will set tab stops at positions 1,9,17,…

    For compatibility, GNU expand also accepts the obsolete option syntax, ‘-t1[,t2]…’. New 
    scripts should use ‘-t t1[,t2]…’ instead.

А вот аналогичный кусок на версию 8.26:

‘-t tab1[,tab2]…’
‘--tabs=tab1[,tab2]…’

    If only one tab stop is given, set the tabs tab1 spaces apart (default is 8). Otherwise, 
    set the tabs at columns tab1, tab2, … (numbered from 0), and replace any tabs beyond the 
    last tab stop given with single spaces. Tab stops can be separated by blanks as well as by 
    commas.

    For compatibility, GNU expand also accepts the obsolete option syntax, ‘-t1[,t2]…’. New 
    scripts should use ‘-t t1[,t2]…’ instead.

Даже не читая, по объёму текста видно, что описание опции -t в версии 8.31 на три абзаца больше. А если всё-таки почитать, то становится ясно, что запись /1 допустима для 8.31 и недопустима для 8.26, о чём тебе и было недвусмысленно сказано: expand: tab size contains invalid character(s): '/1'. Если бы ты умел читать написанное, то это было бы очевидно с самого начала.

Я не умею читать исходники Си, …

В данном случае это умение не требуется: достаточно умения читать документацию и малой толики самостоятельности. Но ты, видимо, из тех, кто смотрит в книгу, а видит фигу.

…больше не заходи в эту тему – …. кому-нибудь другому мозги.

Сделано. Ты в игноре.

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