Попробуйте
альт + забой
В elementary OS это работает так, как вы хотите (так же, как ctrl + backspace)
Почти готово:
$ sed -E 's/^([0-9][0-9][0-9])\./\100./' file
46066.874.89
48569.123.56
56489.256.88
65400.12.32
84689.25.69
Ваша команда sed
вставляет два нуля после трех цифр и еще один символ в начале каждой строки. .
соответствует «любому символу». Даже если вы экранировали точку как \.
, чтобы она соответствовала реальной точке, вы бы вставили два нуля после точки.
Небольшая настройка заставит его работать:
$ sed 's/^\([0-9]\{3\}\)\./\100./' file
46066.874.89
48569.123.56
56489.256.88
65400.12.32
84689.25.69
или, если ваш sed
поддерживает расширенные регулярные выражения (, большинство из них в настоящее время):
$ sed -E 's/^([0-9]{3})\./\100./' file
46066.874.89
48569.123.56
56489.256.88
65400.12.32
84689.25.69
Использование awk
и более общий подход:
$ awk -F. 'BEGIN { OFS=FS } length($1) < 5 { $1 = sprintf("%s%.*d", $1, 5 - length($1), 0) }; 1' file
46066.874.89
48569.123.56
56489.256.88
65400.12.32
84689.25.69
Эта команда awk
будет для каждой записи в первом столбце, разделенном точками -длиной менее пяти символов, заполнить строку необходимым количеством нулей, чтобы общая длина строки стала равной пяти. персонажи.
Это делается путем форматирования целого числа 0
как строки, заполненной нулями, до недостающей длины. Затем они объединяются с существующими данными в поле.
Это будет работать для любой короткой строки в первом поле (, а не только для строк, содержащих три символа ).
Заполнение нулями в начале строки проще (но не то, что просили,предоставлено):
$ awk -F. 'BEGIN { OFS=FS } { $1 = sprintf("%.5d", $1) }; 1' file
46066.874.89
48569.123.56
56489.256.88
00654.12.32
84689.25.69
Мы просто используем тот факт, что первое поле содержит целое число, и форматируем его с sprintf()
как заполненное нулем -целое число правильной ширины.
В обеих командах 1
в конце вызывает действие по умолчанию, которое заключается в печати текущей строки. (ее можно заменить на { print }
или{ print $0 }
).