Повторите номер списка при вставке новой записи

У меня есть текстовый файл с пронумерованными записями:

1. foo 2. bar 100% 3. kittens 4. eat cake 5. unicorns 6. rainbows 

и так далее до некоторого большого количества. Затем после пустой строки новый блок начинается с 1.

Я вставляю новую запись, заменяя, скажем, 4. и мне нужно перенумеровать все последующие записи в блоке:

 1. foo 2. bar 100% 3. kittens 4. sunshine < 5. eat cake 6. unicorns 7. rainbows 

  • Разделить файл на отдельные файлы с помощью шаблона
  • Регистрация данных USB Ubuntu MATE
  • Получение текста от последнего маркера до EOF в POSIX.2
  • изменение порядка элементов в списке
  • Создание электронной таблицы из текстового файла
  • Заменить числа в первом разделе файла в результате расчета
  • Добавить строку в начало второй строки, используя unix
  • Как подсчитать, сколько разных слов у меня есть в файле, в столбце
  • 5 Solutions collect form web for “Повторите номер списка при вставке новой записи”

    Решение VIM

    Начните с создания своего списка:

     1. foo 2. bar 100% 3. kittens 4. eat cake 5. unicorns 6. rainbows 

    Вставить запись

     1. foo 2. bar 100% 3. kittens 4. eat cake 4. sunshine 5. unicorns 6. rainbows 

    Поместите курсор на 4. sunshine и из режима команды нажмите shift + v , затем сдвиньте + g . Это визуальный выбор до конца файла. Вы также можете перемещать курсор в конец блока обычными способами.

    Нажмите : для входа в командный режим, и вы увидите следующее:: :'<,'> . Теперь введите следующее:

    norm Ctrl + V Ctrl + A

    Что делают Ctrl-v и ctrl-A, они позволяют вводить «точный» ключ, поэтому он будет меняться на ^A , выделен. Это в основном говорит for all lines selected, execute in normal mode keypress Ctrl-A том, что for all lines selected, execute in normal mode keypress Ctrl-A и Ctrl-A по умолчанию увеличивает число под курсором. Вы увидите, что цифры меняются

    Решение в действии:

    До

    введите описание изображения здесь

    После

    введите описание изображения здесь

    Вы всегда можете добавить новую запись с помощью x. newentry синтаксис x. newentry и перенумеровать все после чего с чем-то вроде:

     awk -F . -v OFS=. '{if (NF) $1 = ++n; else n = 0; print}' 
    • -F . : устанавливает разделитель полей в . 1
    • -v OFS=. : то же самое для разделителя поля вывода ( -F . является коротким для -v FS=. ).
    • {...} : нет условия, поэтому код внутри {...} запускается для каждой строки
    • if (NF) , если число полей больше 0. С FS . , это означает, что если текущая строка содержит хотя бы одну . , Мы могли бы также сделать это, if (length) проверить непустые строки.
    • $1 = ++n : установите первое поле в приращение n (первоначально 0, затем 1, затем 2 …).
    • else n = 0 : else (при NF == 0) сбросить n до 0.
    • print : напечатать (возможно, измененную) строку.

    1 Синтаксис: -F <extended-regular-expression> но когда <extended-regular-expression> – это единственный символ, который не принимается как регулярное выражение (где . Означает любой символ), а вместо этого.

    Максимальный избыток (и сложность! И ошибки!) Могут быть получены через модуль Perl Text :: Autoformat .

     % < input 1. foo 2. bar 100% 3. kittens 4. it is getting dark. there may be a grue 4. no seriously, it's getting dark 4. really, you should find a light or something. 4. are you even paying attention? helloooo 4. eat cake 5. unicorns 6. rainbows % perl -MText::Autoformat -0777 -ple '$_=autoformat $_, { all => 1 }' < input 1. foo 2. bar 100% 3. kittens 4. it is getting dark. there may be a grue 5. no seriously, it's getting dark 6. really, you should find a light or something. 7. are you even paying attention? helloooo 8. eat cake 9. unicorns 10. rainbows % 

    Фактические результаты будут зависеть от ввода, желаемого выхода, пройденных опций и т. Д.

    Используя базовые инструменты оболочки, это можно сделать так: это может быть даже проще:

     paste -d . <(seq $(wc -l < new.list)) <(cut -d . -f 2- < new.list) 

    Я объясню извне:

     paste -d . file1 file2 

    создает выходные строки из файлов в виде столбцов. -d . устанавливает разделитель в . , который будет зависеть от новых номеров.

     commandA <(commandB) 

    запускает commandB и выводит вывод так, как если бы он считывал файл в commandA , который ожидает имя файла в качестве аргумента. (См. Замену команд.)

    Второй аргумент paste , <(cut -d . -f 2- < new.list) , выводит второй столбец без изменений, каждая строка из второго поля <(cut -d . -f 2- < new.list) , что означает начало после . ,

    Первый аргумент paste создает новые последовательные номера строк: он сначала подсчитывает строки, используя строки «wordcount lines»: $(wc -l < new.list) , и использует это число для создания последовательности чисел от 1 до count, с seq 7 .

    удалить числа: cut -d" " -f2- < list.txt > temp.txt

    вставить строку в temp.txt

    make numbers: cat -n temp.txt| sed -e 's/^[ ]*\([0-9]*\)[ \t]*\(.*\)/\1. \2/' > list.txt cat -n temp.txt| sed -e 's/^[ ]*\([0-9]*\)[ \t]*\(.*\)/\1. \2/' > list.txt

    Interesting Posts

    Удаление водяных знаков из файла pdf

    Инструмент, который помогает мне быть разумным в разрешениях?

    Grub2 в Ubuntu 12.04 не добавляет «тихий всплеск» к ядру Fedora

    Поиск файлов в порядке времени

    Почему Vim не может открыть текстовый файл размером 100 МБ, если у меня 16 ГБ оперативной памяти?

    Разрешить приложению использовать общий общий объем сети, если приложение знает адрес или путь тома

    Печать оцениваемых приглашающих заполнителей для отображения

    / scripts / installimagemagick теперь устарела

    GNOME: нижняя панель задач отсутствует / после обновления

    Какой тип файла / dev / core или / proc / kcore?

    iptables не перечисляет правила, которые я создал

    Правильная настройка операционной системы на зашифрованном диске LUKS с алгоритмом non-aes для дистрибутива на основе yum (CentOS)

    Интерактивный ssh ​​работает, но не rsync или scp, на OSX

    `command. *` действует в родительском каталоге

    Есть ли автообновляющий графический читатель текстовых файлов?

    Linux и Unix - лучшая ОС в мире.