Это, вероятно, слишком сложно, но оно охватывает все угловые случаи, которые я тестировал:
sed 's/^\([^0-9]*\)0/\1\n0/;s/$/}/;s/\([^0-9\n]\)0/\1\n/g;s/\n0\+/\n/g;s/\n\([^0-9]\)/0\1/g;s/\n//g;s/}$//' inputfile
Объяснение:
Используется метод «разделяй и властвуй» для вставки новых строк для разделениясегменты линии, чтобы ими можно было управлять индивидуально.
s/^\([^0-9]*\)0/\1\n0/
- вставить новую строку перед первым нулем s/$/}/
- добавить символ конца буфера s/\([^0-9\n]\)0/\1\n/g
- вставлять новые строки перед каждым ведущим нулем (и удалять первый) s/\n0\+/\n/g
- удалять оставшиеся начальные нули s/\n\([^0-9]\)/0\1/g
- заменять пустые нули s/\n//g
- удалить переводы строк s/}$//
- удалить буфер конца строки
Этот файл:
0 foo 1 bar 01 10 001 baz 010 100 qux 000 00 0001 0100 0010
100 | 00100
010 | 010
001 | 001
100 | 100
0 | 0
00 | 0
000 | 0
00 | 00
00 | 00
00 | 00 z
Становится:
0 foo 1 bar 1 10 1 baz 10 100 qux 0 0 1 100 10
100 | 100
10 | 10
1 | 1
100 | 100
0 | 0
0 | 0
0 | 0
0 | 0
0 | 0
0 | 0 z