Подтвердить что ты не робот

Как заставить Vim соответствовать строке, не начиная с семизначного числа?

У меня есть файл с примерно 1000 строк. Все строки начинаются с семизначного числа, за исключением случайной строки. Мне нужно поймать эти строки и фактически присоединиться к ним с предыдущей строкой.

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

^\d\{7}

Я не могу заставить его соответствовать любой строке, которая не соответствует этому шаблону, хотя это действительно то, что мне нужно.

В качестве второго вопроса, который я буду вставлять в этот. Возможно ли иметь какие-либо строки, которые соответствуют (или не соответствуют тому, чтобы оставаться в соответствии с тем, что я пытаюсь сделать), чтобы присоединиться к предыдущей строке (в отличие от команды J, которая приносит следующая строка до текущей)?

Спасибо

4b9b3361

Ответ 1

^\(\d\{7}\)\@!

Это синтаксис regex vim для отрицательного просмотра.

Если вы делаете это как массовую команду :, вы должны просто сделать

:v/^\d\{7}/-1j

Ответ 2

Теперь, для реального ответа

Регулярное выражение, которое соответствует строкам, которые не начинаются с 7 цифр, очень просто:

.{0,6}([^0-9].*)?

Более классический эквивалент регулярного выражения без синтаксиса {} на самом деле более читабельен: он визуально показывает нам, что происходит:

(|.|..|...|....|.....|......)([^0-9].*)?

т.е. совпадение между 0 и 6 символами, которое может быть любым, необязательно сопровождаемым недигитом, которое, если оно произойдет, может сопровождаться нулем или несколькими дополнительными символами. Это гарантирует, что если строка с семью символами или дольше совпадает, по крайней мере один из первых семи символов является недигитированным.

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

^.\{0,6\}\([^0-9].*\)\?$

Я не "делаю" \d; это слишком новомодно.:)

Ответ 3

Регулярное выражение

^\(\d\{7}\)\@!

инвертирует ваше исходное выражение. Для получения дополнительной информации об этом синтаксисе см. Здесь:

:help \@!

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

:%s/$\n^\(\d\{7}\)\@!//g

Ответ 4

Вот мое решение с помощью awk, которое можно вызвать внутри vim:

$ cat seven.awk
# Script to join lines that does not start with 7 digits
/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ { print; next }
{ printf $0; getline; print }

$ cat seven.txt
123
4579 bad
7654321 This line is OK
1234567 OK So is this
111
2222 bad again
4443333 OK again

$ awk -f seven.awk seven.txt
1234579 bad
7654321 This line is OK
1234567 OK So is this
1112222 bad again
4443333 OK again

Пожалуйста, извините мое неуклюжие выражения: мой awk старый, и он не понимает причудливого выражения:\d {7}. Если вы хотите вызвать эту команду изнутри vim для всего файла:

:%!awk -f seven.awk