1

У меня есть файл, содержащий целые числа (номера строк) и текст. Извлекая PDF-файл, эти номера строк помещаются в отдельные строки текста, и я хочу удалить все эти номера строк. Я не очень хорошо разбираюсь в регулярных выражениях, но я на 100% уверен, что это не должно быть слишком сложно. Я использую vim/nvim, но если бы мне пришлось использовать awk/sed, это бы сработало и для меня.

Файл выглядит примерно так:

123
124
125

Text was found in
those three lines
should stay

Поэтому в идеале я хочу найти: все строки, которые начинаются с положительного целого числа (1,2,3 ... 123456) и не содержат ничего, кроме этого целого числа. Они должны быть удалены.

Буду признателен за любую оказанную помощь.

Бонусный вызов: по какой-то причине некоторые строки начинаются с ^L1234 , поэтому есть дополнительный специальный символ. В какой-то момент я бы тоже хотел их удалить. Может быть отдельные шаги, хотя.

2 ответа2

0

Удалить строки, начинающиеся и содержащие только целые числа в Vim

:%s/^[0-9]\+\n//gc

объяснение

  • :%s// - глобальный поиск и замена
  • ^ - начало в начале строки
  • [0-9] - цифры совпадения
  • \+ - жадное совпадение с одним или несколькими
  • \n соответствует символу новой строки (Примечание: проверьте окончания строк, они различаются в разных системах и могут быть, например, \r\n вместо)
  • gc - глобальное совпадение + подтверждение (уберите c если есть много или вы уверены,

Выход

123
124
125

Text was found in
those three lines
should stay

:%s/^[0-9]*\n//g

Text was found in
those three lines
should stay

бонус

В ответе Тердона на U & L, ^L - это form feed character перевода формы , который можно удалить с помощью sed:

sed 's/\o14//g' file 

Стоит прочитать этот ответ, чтобы увидеть другие способы сделать это.

0
  • [0-9] - это простой набор цифр, который работает практически везде. В Vim вы также можете использовать \d (десятичная цифра).
  • Вы хотите один или несколько экземпляров: добавьте множитель \+ .
  • Это должен быть единственный элемент в строке, поэтому регулярное выражение необходимо привязать к началу и концу (через ^ и $ соответственно).
  • Вы хотите попытаться сопоставить все строки; в Vim это делается через :global/{pattern}/ .
  • Соответствующие строки должны быть :delete d.

Вместе взятые:

:global/^[0-9]\+$/delete

Вы также можете использовать sed ; это быстрее и работает не в интерактивном режиме. Поскольку это автоматически применяет любое правило ко всем входным строкам, вам не нужны :global , а :delete - просто d . При использовании -i замена выполняется на месте (поэтому убедитесь, что все правильно и у вас есть резервная копия исходного файла!)

sed -i -e '/^[0-9]\+$/d' file

Для необязательного префикса множитель этого равен \? , Если этот ^L является одним символом, вам, вероятно, нужно ввести его в Vim как <C-V><C-L> .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .