2015-10-14 4 views
0

Я использую TextWrangler для получения конкретной информации из XML. Мне нужно найти список имен файлов, которые присутствуют, и распечатать только те имена файлов.Использование GREP для замены всех, но совпадающих строк

Пример кода ниже:

<file id="file_1045280"> 
    <name>SKY_A026C032_150707_R4RO.mov</name> 
    <pathurl>file://localhost/M:/FPL_MEDIA/04_MEZZANINE/SKY/SKY-EP03/SKY-0312_20150707_AA_A026/SKY_A026C032_150707_R4RO.mov</pathurl> 
    <duration>1796</duration> 
    <timecode> 
     <rate> 
      <ntsc>false</ntsc> 
      <timebase>25</timebase> 
     </rate> 
     <frame>0</frame> 
     <displayformat>NDF</displayformat> 
    </timecode> 
    <media> 
     <video> 
      <duration>1796</duration> 
      <samplecharacteristics> 
       <width>1920</width> 
       <height>1080</height> 
      </samplecharacteristics> 
     </video> 
    </media> 
</file> 
          <sourcetrack> 
           <mediatype>video</mediatype> 
          </sourcetrack> 
          <link> 
           <linkclipref>clipItem_1045280</linkclipref> 
           <mediatype>video</mediatype> 
           <trackindex>1</trackindex> 
          </link> 
         </clipitem> 
         <enabled>TRUE</enabled> 
         <locked>FALSE</locked> 
        </track> 
       </video> 
      </media> 
     </clip> 
     <clip id="clip_1045282"> 
      <name>SKY_A026C018_150707_R4RO</name> 
      <duration>958</duration> 
      <rate> 
       <ntsc>false</ntsc> 
       <timebase>25</timebase> 
      </rate> 
      <in>-1</in> 
      <out>-1</out> 
      <masterclipid>clip_1045282</masterclipid> 
      <ismasterclip>TRUE</ismasterclip> 
      <media> 
       <video> 
        <track> 
         <clipitem id="clipitem_1045282"> 
          <name>SKY_A026C018_150707_R4RO</name> 
          <duration>958</duration> 
          <masterclipid>clip_1045282</masterclipid> 
          <rate> 
           <ntsc>false</ntsc> 
           <timebase>25</timebase> 
          </rate> 
          <in>0</in> 
          <out>958</out> 
          <start>0</start> 
          <end>958</end> 
<file id="file_1045282"> 
    <name>SKY_A026C018_150707_R4RO.mov</name> 
    <pathurl>file://localhost/M:/FPL_MEDIA/04_MEZZANINE/SKY/SKY-EP03/SKY-0312_20150707_AA_A026/SKY_A026C018_150707_R4RO.mov</pathurl> 
    <duration>958</duration> 
    <timecode> 
     <rate> 
      <ntsc>false</ntsc> 
      <timebase>25</timebase> 
     </rate> 
     <frame>0</frame> 
     <displayformat>NDF</displayformat> 
    </timecode> 
    <media> 
     <video> 
      <duration>958</duration> 
      <samplecharacteristics> 
       <width>1920</width> 
       <height>1080</height> 
      </samplecharacteristics> 
     </video> 
    </media> 
</file> 
          <sourcetrack> 
           <mediatype>video</mediatype> 
          </sourcetrack> 
          <link> 
           <linkclipref>clipItem_1045282</linkclipref> 
           <mediatype>video</mediatype> 
           <trackindex>1</trackindex> 
          </link> 
         </clipitem> 
         <enabled>TRUE</enabled> 
         <locked>FALSE</locked> 
        </track> 
       </video> 
      </media> 
     </clip> 
     <clip id="clip_1045283"> 
      <name>SKY_A026C033_150707_R4RO</name> 
      <duration>1202</duration> 
      <rate> 
       <ntsc>false</ntsc> 
       <timebase>25</timebase> 
      </rate> 
      <in>-1</in> 
      <out>-1</out> 
      <masterclipid>clip_1045283</masterclipid> 
      <ismasterclip>TRUE</ismasterclip> 
      <media> 
       <video> 
        <track> 
         <clipitem id="clipitem_1045283"> 
          <name>SKY_A026C033_150707_R4RO</name> 
          <duration>1202</duration> 
          <masterclipid>clip_1045283</masterclipid> 
          <rate> 
           <ntsc>false</ntsc> 
           <timebase>25</timebase> 
          </rate> 
          <in>0</in> 
          <out>1202</out> 
          <start>0</start> 
          <end>1202</end> 

На данный момент я использую следующий Grep:

.*?(\<name\>)(.*)(.mov).* 

Это удается найти строки, которые мне нужны. Однако мне нужно заменить весь оставшийся текст ничем, поэтому у меня останется список имен файлов.

Может ли кто-нибудь посоветовать, как я могу это сделать?

Заранее спасибо, Matt

+0

ли вам нужен выход, чтобы быть только ' SKY_A026C032_150707_R4RO.mov SKY_A026C018_150707_R4RO.mov'? –

+0

В идеальном решении я хотел бы, чтобы результат был только SKY_A026C032_150707_R4RO.mov, минус теги и, но вашего решения было бы достаточно, поскольку я мог бы просто запустить второй Grep. – matttickner

+0

У вас установлен perl? –

ответ

-1

Как об этом. Там немного перекрываются, но это означает

"match everything as if it's a single line that 
[comes after </name> and before <name>], or 
[is between the beginning and <name>] or 
[is the <name> or </name> tags itself]. 

(?ms)(?<=<\/name>)(.*?)(?=<name>)|(^.*?<name>)|(<.?name>) 

https://regex101.com/r/vV4xZ6/2 
+0

Это очень близко @ergonaut, спасибо. Был ли способ только перечислить экземпляры имени файла, которые заканчиваются на .mov? Итак, экземпляр имени файла после тега , но не тег ? Таким образом, фактическое имя файла указывается только один раз для каждого файла. – matttickner

+0

это довольно сложно, лучшим решением было бы использовать фактический парсер. – ergonaut

+0

Я боюсь, что не знаю, что это значит? По сути, я просто хочу найти результаты этого Grep, который вы закончили. Я пробовал модифицировать ваше выражение, чтобы отразить это, но он всегда находит что-нибудь, содержащееся между тегами. есть ли способ изменить его так, чтобы он опережение/за означает, что строка между должна закончиться в .mov остаться после замены? – matttickner

0

Использование TextWrangler, быстрый способ был первым использованием ->Текст ->Технологические линии, содержащие ... для поиска <name>.+\.mov</name> с Grep и Скопирован в новый документ.
Результирующий файл можно очистить, чтобы найти (что-то еще) ^\s*<name>(.+\.mov)</name>\s*$ и заменить на \1 с Grep проверено.

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

  • Нет связанных вопросов^_^