LINUX.ORG.RU

найти самую дальнюю «метку» и выровнять остальные по ней

 


0

3

привет.

есть приблизительно такое содержимое:

<some info>:<other info>: main info
тут длина «<some info>:<other info>:» может меняться, что мешает. хочется сделать так, чтоб в файле производился поиск самого дальнего второго двоеточия, и все остальные строки выравнивались под него.

т.е. чтоб из этого:

bla:bla: data-data-data
bla-bla:bla: data-data-data
bla-bla:bla-bla: data-data-data
получилось это:
bla:bla        : data-data-data
bla-bla:bla    : data-data-data
bla-bla:bla-bla: data-data-data

можно ли это сделать только регулярками для sed, и чтоб в один заход?

спасибо.

★★★
Ответ на: комментарий от deep-purple

почти. вот только хотелось бы чтоб поиск самого дальнего второго двоеточия тоже sed выполнял...

niXman ★★★
() автор топика
column -t

Или обязательно sed?

alozovskoy ★★★★★
()

В один заход - вряд ли.

Вот тебе двухстрочник на питон

filename = 'foo.txt'
m=max(len(l.rsplit(':', 1)[0]) for l in open(filename))
for l in open(filename): if ':' in l:print(('{:<%d}:{}'%m).format(*l.rsplit(':',1)))
pawnhearts ★★★★★
()

чтоб в один заход?

Нет, конечно. Сами-то подумайте — откуда потоковый фильтр может знать, какова наибольшая длина поля до того, как считает весь поток.

Zmicier ★★★★★
()

«Вы просили лапшу — я дал вам лапшу.»

FNAME='1.txt'
MAX_LEN=`cat $FNAME | awk -F ':' 'BEGIN {max=0;} {l=length($1$2); if (l > max) max = l;} END {print (max+1);}'`
cat $FNAME | awk -v len=$MAX_LEN -F ':' '{fmt="%-"len"s:%s\n"; printf fmt,$1":"$2,$3}'

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

anonymous
()
Ответ на: комментарий от thesis

Подробности давай. Просто column оставит двоеточия на месте, а не западит.

bla:bla:          data-data-data
bla-bla:bla:      data-data-data
bla-bla:bla-bla:  data-data-data
anonymous
()
Ответ на: комментарий от anonymous

Пересовывание двоеточий я оставлю тебе в качестве домашки. Разрешаю пользоваться седом.

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

В один заход - вряд ли.

под одним заходом подразумевался один запуск sed, пусть и с несколькими регулярками.

в два захода я и сам умею. пайтон тоже умею. а вот заставить sed сделать все это за один запуск - не умею.

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

а вот заставить sed сделать все это за один запуск — не умею.

И не сумеете — sed — это «stream editor»; а как известно, нельзя войти в одну реку дважды. Один запуск — один проход.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.