Найдите строки, которые не начинаются “<”, работает действие

Использую энергию и имеют файл крупного текста, который содержит некоторый 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!

Я ищу способ искать строки, которые не начинаются с a < символ и, для тех строк, добавляют открытие и закрытие <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>

Как я нахожу строки, которые не соответствуют запуску < символ?

6
задан Valentin Rocher 15 February 2010 в 15:06
поделиться

5 ответов

^([^<].*)$

Убедитесь, что в ваших параметрах не разрешено «Сопоставлять точку новой строки» и заменить на:

<p>$1</p>

Vim требует, чтобы вы экранировали определенные символы, но у меня фактически нет vim, так что это мое лучшее предположение для всего правила:

s:^\([^<].*\)$:<p>\1</p>:g
11
ответ дан 8 December 2019 в 18:35
поделиться

вот логика. просмотрите файл, проверьте < в начале строки, если нет, создайте новую строку с

и

и повторить это. На самом деле нет необходимости в сложном регулярном выражении

с bash

#!/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>
1
ответ дан 8 December 2019 в 18:35
поделиться

Белый - интересная бесплатная альтернатива.

-121--4379661-

Общий способ сделать это - добавить все предметы из исходной коллекции в словарь, а затем удалить предметы из другой коллекции:

public static IEnumerable<T> Subtract<T>(IEnumerable<T> source, IEnumerable<T> other)
{
    return Subtract(source, other, EqualityComparer<T>.Default);
}

public static IEnumerable<T> Subtract<T>(IEnumerable<T> source, IEnumerable<T> other, IEqualityComparer<T> comp)
{
    Dictionary<T, object> dict = new Dictionary<T, object>(comp);
    foreach(T item in source)
    {
        dict[item] = null;
    }

    foreach(T item in other)
    {
        dict.Remove(item);
    }

    return dict.Keys;
}
-121--4998132-
:%s/^[^<].*/<p>&<\/p>/

или:

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

это все, что необходимо.

1
ответ дан 8 December 2019 в 18:35
поделиться

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

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

^ O выполняется нажатием CTRL + o

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

:v/^</normal yss<p>
0
ответ дан 8 December 2019 в 18:35
поделиться

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

:%s/^\s*[^<]\+$/<p>&<\/p>/g
0
ответ дан 8 December 2019 в 18:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: