2

У меня есть большое количество текста с отступом (выделено) табуляцией, в котором отсутствует начальный символ маркера:

        some point
            a sub-point

Я хочу заменить каждую вкладку на 2 пробела и добавить дефис впереди. Это целевой формат мне нужен:

  - some point
    - a sub-point

Найти:
Я могу использовать регулярное выражение \t+\S чтобы найти «любое количество вкладок, за которыми следуют любые непробельные символы». Это прекрасно работает, и функция "найти" выделяет начало каждой строки, вплоть до первого символа без табуляции.

Заменить:
Как я могу использовать регулярное выражение, чтобы указать «заменить каждую вкладку двумя пробелами, за которыми следуют один дефис и один пробел, за которым следует оригинальный символ без табуляции»? В частности:

  1. Как указать, что замена должна происходить «столько раз, сколько было совпадений в поиске»? (Таким образом, три вкладки станут шестью пробелами и т.д.)
  2. Как мне указать литерал «один дефис, затем один пробел»?
  3. Как мне указать "сохранить неизменяемый символ без табуляции"?

Мой гугл-фу привел меня к понятию \1 но я не понимаю, как я могу это использовать. Мое тестирование методом проб и ошибок приводило только к ошибкам.
Обновить:
Я обнаружил кое-что о \1: я должен использовать круглые скобки в моей строке поиска: (\t+)(\S) а затем использовать это в части замены: \1- \2 . Это помогает мне решить пункты № 2 и № 3 выше, но я все еще в растерянности относительно № 1!
Up-Update:
Duh - # 1 может быть простым не-регулярным действием найти / заменить, если в тексте нет символов табуляции. Это то, что мне нужно исследовать сейчас!

Я пытаюсь с Ubuntu Gedit, но я мог бы также использовать Notepad++ или Sublime, если у вас есть предложения для конкретного редактора.

2 ответа2

1

Есть два метода, которые вы можете использовать.

Вы можете искать всю строку + что будет дальше, и использовать группировки, чтобы заменить ее одной или несколькими группами, но не всеми. Это где $1 или \1 вступает в игру.

Вы также можете искать только ту часть, которую хотите заменить, и просто заменить ее чем-то другим.

Сначала создайте регулярное выражение, которое вы хотите явно заменить, и найдите его. Если ваш поиск ищет несколько частей строки и вы хотите сохранить что-то посередине, то группировка обязательна. Пример: найдите [b]text[/b] и замените его на <b>text</b>

Ваше регулярное выражение будет что-то вроде \[b\](.+)\]\/b\] и заменит его на <b>\1</b>

Если вам нужно всего лишь изменить каждое вхождение текста, представляющее собой одну непрерывную строку, вы можете специально выполнить поиск и заменить его. Например,          -My example и замените его на  - My example (который в основном заменяет любые табуляции на два пробела и добавляет пробел после -, вы должны найти \t+- и заменить его на  -

Регулярное выражение здесь означает: поиск любой вкладки, которая встречается 1 или более раз, за которой следует перенос. Если вы ищете эту строку без фактической замены, вы увидите, что она выберет текст, который вы хотите заменить.

Если вы хотите заменить любую вкладку двумя пробелами, вам нужно просто найти \t и заменить ее на  

Заметьте, я использовал пробел, за которым следовали alt+255 везде в этом посте, чтобы набрать 2 пробела подряд, в противном случае SuperUser сжимает все до 1 пробела.

1

Вы можете сделать это с помощью Notepad++ в два этапа:

Первый шаг:

  • Ctrl+H
  • Найти что: \t
  • Заменить: (2 пробела)
  • проверить обернуть
  • проверьте регулярное выражение
  • Заменить все

Второй шаг:

  • Найти что: ^\h+
  • Заменить на: $0-
  • проверить обернуть
  • проверьте регулярное выражение
  • Заменить все

Объяснение:

^       : beginning of line
\h+     : 1 or more horizontal spaces

Замена:

$0      : the whole match (ie. all the spaces at the beginning of each line)
-       : a dash followed by a space

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