2013-12-18 2 views
0

У меня есть около 1400 файлов уценки, которые я пытаюсь очистить. Как часть этого, мне нужно захватить строки и заменить их в файле, но только после определенного раздела.Заменить строки только в части документа

Вот пример файла:

--- 
title: 'This is the post’s title' 
author: foobar 
date: 2007-12-04 12:41:01 -0800 
layout: post 
permalink: /2007/12/04/foo/ 
categories: 
    - General 
--- 


Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta ’ sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur. 

’ 

Я хочу, чтобы заменить все ’ строк с ', но только после заголовка.

я могу захватить заголовок с этим:

(---((.|\n)*?)---) 

Но я с трудом захватив остальную часть текста после заголовка.

Любые предложения? Я использую TextMate, но также могу сделать это в терминале (на Mac).

+0

Почему знак nsregularexpression? Вы также хотите написать код Objective C? – Barmar

+0

nsregularexpression tag? Я могу написать Objective-C, но предпочел бы не в этом случае. – mikechambers

ответ

0

В TextMate:

модели детали:

(     # capture group 1: all possible content before ’ 
    (?:    # non capturing group: possible "anchors" 
     ---   # begining of the header: entry point 
     (?>   # atomic group: possible content of the header 
      [^-]++ # all that is not a - 
      |   # OR 
      -(?!--) # a - not followed by -- 
     )*   # repeat the atomic group zero or more times 
     ---   # end of the header 
     |    # OR 
     \G(?<!\A) # contiguous to a precedent match (not at the start) 
    )    # close the non capturing group 
    (?>    # atomic group: all that is not &#8217; 
     [^&]++  # all character except & 
     |    # OR 
     &(?!#8217;) # & not followed by #8217; 
    )*    # repeat the atomic group zero or more times 
)     # close the capturing group 
&#8217; 

Идея заключается в том, чтобы использовать функцию \G для допускают только смежные совпадения.

Первое совпадение: точкой входа является заголовок. После того, как заголовок найден (первая возможность, в группе без захвата), шаблон соответствует всему, что не является &#8217; (вторая атомная группа), до &#8217;.

Другие совпадения: \G заставляет другие спички быть смежными с прецедентом. Второй матч начинается с первого конца матча, третий со второго конца и т. Д.

+0

Спасибо. Это получилось! – mikechambers

0

awk может сделать это путем подсчета заголовков разделителей линий

awk -v quote="'" '/^---$/ { header++} { if (header >= 2) { gsub("&#8217;", quote); }}1' infile > outfile 
Смежные вопросы