У меня есть файл, содержащий целые числа (номера строк) и текст. При извлечении PDF-файла эти номера строк были помещены в отдельные строки из текста, и я хочу удалить все эти номера строк. Я не очень хорошо разбираюсь в регулярных выражениях, но я на 100% уверен, что это не должно быть очень сложно. Я использую vim/nvim, но если бы мне пришлось использовать awk/sed, это тоже сработало бы для меня.
Файл выглядит примерно так:
123
124
125
Text was found in
those three lines
should stay
Поэтому в идеале я хочу искать: все строки, которые начинаются с положительного целого числа (1,2,3...123456) и не содержат ничего, кроме этого целого числа. Их следует удалить.
Буду признателен за любую оказанную помощь.
Бонусный вызов: по какой-то причине некоторые строки начинаются с ^L1234
, так что есть дополнительный специальный символ. В какой-то момент я бы захотел удалить и их. Хотя это могут быть отдельные шаги.
решение1
[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>
.
решение2
Удалить строки, начинающиеся и содержащие только целые числа в Vim
:%s/^[0-9]\+\n//gc
Объяснение
:%s//
- глобальный поиск и замена^
- начать с начала строки[0-9]
- сопоставьте цифры\+
- жадное совпадение одного или нескольких\n
сопоставьте новую строку (Примечание: проверьте окончания строк, они различаются в разных системах и могут быть eg\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
Стоит прочитать этот ответ, чтобы увидеть другие способы сделать это.