Замените все строки, начинающиеся с #WAV, одной строкой, блокнот

#regex #notepad

Вопрос:

У меня есть тысячи файлов, в каждом из которых есть один фрагмент строк, которые начинаются с #WAV . Этот фрагмент может находиться в любом месте файла, но всегда является «фрагментом»

 #WAV 001.wav
#WAV "something"
#WAV 21021029910291029.ogg
 

Эти фрагменты могут быть длиной 1000 строк или всего 3, как в приведенном выше примере

Мне нужно заменить весь кусок (все строки, которые начинаются с #WAV) одной строкой.

Так что вышесказанное просто стало бы

 EXAMPLE REPLACEMENT
 

Обратите внимание, что это должно работать для любого куска размера, и то, что может произойти после #WAV , непредсказуемо.

использование #WAV.* в качестве регулярного выражения не сработает, потому что оно заменит все вхождения этой строки, а не весь фрагмент.

использование #WAV(.*)#WAV и попытка заменить группу захвата не сработают, потому что я не могу быть уверен в «конце» группы захвата.

Комментарии:

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

Ответ №1:

Воспользуйся

 ^#WAVb.*(?:R#WAVb.*)*
 

См.Доказательство регулярного выражения.

объяснение

 --------------------------------------------------------------------------------
  ^                        the beginning of the string
--------------------------------------------------------------------------------
  #WAV                     '#WAV'
--------------------------------------------------------------------------------
  b                       the boundary between a word char (w) and
                           something that is not a word char
--------------------------------------------------------------------------------
  .*                       any character except n (0 or more times
                           (matching the most amount possible))
--------------------------------------------------------------------------------
  (?:                      group, but do not capture (0 or more times
                           (matching the most amount possible)):
--------------------------------------------------------------------------------
    R                       line ending 
--------------------------------------------------------------------------------
    #WAV                     '#WAV'
--------------------------------------------------------------------------------
    b                       the boundary between a word char (w)
                             and something that is not a word char
--------------------------------------------------------------------------------
    .*                       any character except n (0 or more times
                             (matching the most amount possible))
--------------------------------------------------------------------------------
  )*                       end of grouping
 

Комментарии:

1. Просто всегда лучше, но этот ответ тоже очень хорош

2. @RafaeldeBem Это удаляет #WAV s даже в последней строке. Он тоже проверяет , так ли это #WAVE... .

3. Разве (^#WAV .*[rn] ) (с пробелом) это не сработало бы так же хорошо?

4. Нет, нет, этого не будет

Ответ №2:

Вы можете использовать следующее регулярное выражение:

 (^#WAV.*[rn] ) 
 

Это будет соответствовать всем строкам, начинающимся с #WAV, в одном выделении.