2015-07-02 2 views
3

Я хочу, чтобы получить первые n символ матча с этого регулярного выражения:Получить первые п символы матча регулярного выражения

(\d+\s*) 

В основном я хочу правую колодку с пробелами. Таким образом, в строках:

12345␢␢␢␢␢␢␢␢123␢␢␢␢␢␢␢ 
123␢␢␢␢␢␢␢␢␢12345␢␢␢␢␢␢ 

Я хочу закончить с:

12345␢␢␢␢␢123␢␢␢␢␢␢␢ 
123␢␢␢␢␢␢␢12345␢␢␢␢␢ 

Есть всегда два матча на линии и линии имеют постоянную длину.

+1

Сопоставьте второй раз с использованием '. {N}'? Не уверен в записной книжке (никогда не использовал ее), но в [tag: grep] вы могли бы просто снова совместить с помощью 'grep -o. \ {N \}', и вы получите желаемый результат. – ShellFish

+0

что вы пытаетесь выразить своим регулярным выражением? почему что-то вроде этого '^. {n}' недостаточно? – bro

+0

@ bro Хорошо. Он будет работать для первой колонки. А второе? Проверьте обновленный вопрос –

ответ

2

Multiple проходит

На основе дополнительной информации о проблеме, и это структура, я бы посоветовал следующие шаги:

  1. Сплит каждая строка в двух, прямо перед вторым рисунком.
  2. Захватите желаемую часть из каждой строки.
  3. Рекомбинируйте линии так, чтобы совпадения находились на их исходной строке.

Это означает что-то вроде этого:

  1. Replace ^(\d*\s*)(\d*\s*)$ с $1\r\n$2. Просто оставьте \r, если вы не на окнах, и я сомневаюсь. Возможно, вам стоит подумать о макросе для добавления в конце строки. Это должно быть то, что не включено в остальную часть документа (например, #). Значение $1 означает замену первой захваченной группы (материал внутри скобок). Поэтому замените его на $1#\r\n$2.
  2. Теперь возьмите желаемую длину каждой строки: (^.{n}).*(#?) и замените на $1$2. Это будет захватывать первые символы n и вставить макрос, если он найден.
  3. Удалить символы перевода после макроса: #\r\n. Удалите их или замените их \0.

Примечание

  • Вам придется фильтровать строки, соответствующие (^\d*\s*) первыми.
  • Если вы хотите получить еще один макрос, введите # в ответ выше. Он не должен содержаться в остальной части файла, по крайней мере, не в конце строки.
  • Этот ответ использует обратные ссылки, которые должны быть no problem.

Однопроходная

один проход может быть возможно тоже здесь.

^(\d[\d\s]{n-1})[^\d]*(\d[\d\s]{n-1}).*$ 

Соответствует этим строкам, если вы извлекаете группу 1 и 2, это будет фильтровать желаемый результат из файла. Просто замените его на $1$2.

1

Заменить:

(\d[\d\s]{n-1})\s* 

С:

$1 

Это заменяет цифру с последующим n-1 цифр или пробельных символов, за которым следует любое количество пробельных символов первыми n символами того, что было подобрано (таким образом, вы должны получить 2 матча за линию).

Смежные вопросы