Предполагая, что в каждой строке есть только один номер;что перед ,
должно быть не более четырех цифр и что всегда есть ,
:
sed 's/[^0-9,]*\([0-9]\+,[0-9]*\).*/ \1/;s/.*\(.....,.*\)/\1/;'
Первая s
избавляет от всего, кроме (первого) числа наи ставит перед ней четыре пробела.Второй удаляет все перед пятым символом до ,
, оставляя достаточно места для правого выравнивания числа.
Вторая команда s
может манипулировать строками ввода, которые не совпадают с первым s
команда.Если возможно, что вход содержит такие строки, вы можете добавить условную ветвь, чтобы избежать выполнения второй замены, если первая не удалась.С Gnu sed это тривиально:
sed 's/[^0-9,]*\([0-9]\+,[0-9]*\).*/ \1/;T;s/.*\(.....,.*\)/\1/;'
T
переходит к концу команд, если предыдущая s
не удалась.У Posix Standard Sed есть только условная ветвь в случае успеха, поэтому вам нужно использовать эту обходную конструкцию:
sed 's/[^0-9,]*\([0-9]\+,[0-9]*\).*/ \1/;ta;b;:a;s/.*\(.....,.*\)/\1/;'
, где ta
(условная ветвь до a
в случае успеха) используется для пропуска b
(безусловная ветвь до конца).:a
- метка, на которую ссылается команда t
.