2010-02-15 4 views
4

Я использую vim и имею большой текстовый файл, который содержит html, брошенный в throoghout. Я пытаюсь подготовить его к Интернету и добавить теги <p></p> к строкам, которые еще не отформатированы. Вот пример того, что у меня есть:Найти строки, которые не начинаются с «<», выполнить действие

Paragraph text one one line [... more ... ] 
Other paragraph text on the next line [... more ... ] 
<h1>html element thrown in on its own line</h1> 
More paragraph text [... more ... ] 
<!-- some other element (always own line) --> 
There is still more text! 

Я ищу способ для поиска линий, не начинается с < характером, и для этих линий, добавить открытие и закрытие <p></p> тегов ... так что, после этого, мой файл напоминает это:

<p>Paragraph text one one line [... more ... ] </p> 
<p>Other paragraph text on the next line [... more ... ] </p> 
<h1>html element thrown in on its own line</h1> 
<p>More paragraph text [... more ... ] </p> 
<!-- some other element (always own line) --> 
<p>There is still more text! </p> 

Как найти строки, сделать не матча стартового < характера?

ответ

10
^([^<].*)$ 

Убедитесь, что ваши варианты запретить «Dot соответствующий символ новой строки» и заменить:

<p>$1</p> 

Vim требует, чтобы избежать определенных символов, но я не actially имеют Vim, так что это мой лучший предположим, что все правило:

s:^\([^<].*\)$:<p>\1</p>:g 
+0

Что это значит _disallow dot matching newline_? Извините, я новичок в vim. Я использовал '% s:^\ ([^>]. * \) $:

\ 1

: g' и он добавил теги абзацев в строку _every_ (даже те, у которых уже есть теги). Почти там ... – thornomad

+1

Угол скобки в этом последнем выражении указывает неверный путь. '[^>]' должен быть '[^ <]'. – Nefrubyr

+0

@thornomad: Извините, Нефрубыр прав.Угловая скобка была неправильной. Я исправил линию. –

1

вот логика. просмотрите файл, проверьте на < в начале строки, если нет, постройте новую строку с <p> и </p> и повторите ее. Там действительно нет необходимости в сложной регулярное выражение

с Баш

#!/bin/bash 
shopt -s extglob 
while read -r line 
do 
    case "$line" in 
     "<"*) echo $line ;; 
     *) echo "<p>$line</p>";; 
    esac 
done <"file" 

с AWK

$ awk '!/^</{$0="<p>"$0"</p>"}{print}' file 

выход

$ awk '!/^</{$0="<p>"$0"</p>"}1' file 
<p>Paragraph text one one line [... more ... ]</p> 
<p>Other paragraph text on the next line [... more ... ] </p> 
<h1>html element thrown in on its own line</h1> 
<p>More paragraph text [... more ... ] </p> 
<!-- some other element (always own line) --> 
<p>There is still more text!</p> 
+0

«Нет необходимости в сложном регулярном выражении», и вы поставляете решение, требующее запуска внешних инструментов? – 2010-02-15 15:09:51

+0

vim, к оболочке, также является внешним инструментом. Будь то awk, sed, vim, ed и т. Д. Все эти инструменты делают вещи в файлы! Между ними действительно нет большой разницы. Даже обычную старую оболочку можно использовать и для «редактирования» файлов. И нет, мое решение не запускается с vim, если это то, что вы говорите. Они запускаются из командной строки. – ghostdog74

+0

OP сказал, что он работает vim. Поэтому вызов оболочки/bash-материала является внешним. – 2010-02-15 15:45:30

0

Это должно работать:

:%s/^\s*[^<]\+$/<p>&<\/p>/g 
+0

он должен начинаться с чего-то другого, кроме <, но <может быть позже. Я бы изменил \ + на *. – 2010-02-15 15:10:12

+0

Я бы не стал. Мое регулярное выражение не обрабатывает пустые строки. Там не было бы

. –

1
:%s/^[^<].*/<p>&<\/p>/ 

альтернативно:

:v/^</s#.*#<p>&</p># 

, что это все, что нужно.

+0

А как насчет пустых строк? –

+0

Что с ними? – 2010-02-16 14:18:22

0

Другой способ сделать это:

:v/^</normal I<p>^O$</p> 

^O выполняется фактически нажав CTRL + O

Или, если вы используете surround.vim плагин:

:v/^</normal yss<p> 

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

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