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

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

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 

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

  • Добавить строку в начало второй строки, используя unix
  • Есть ли способ добавить новые строки в таблицу для создания подгрупп?
  • Как я могу напечатать строки в файле, который содержит два регулярных выражения, где одна является подстрокой другого
  • Удаление первого ^ М из каждой строки файла
  • Как удалить символ и пробел из строки
  • Комментируйте (автоматически) исходный файл LaTeX, чтобы сделать его более читаемым
  • Добавление строки в таблицу
  • Как я могу разобрать вывод многострочной команды в bash?
  • удалить из n-го вхождения в конец файла
  • Unix / Linux - Заменить слова между круглыми скобками
  • Замените все пробелы запятыми в текстовом файле
  • Linux и Unix - лучшая ОС в мире.