<span class="cur_name">This is a sentence </span>
Я хотел просто получить часть "Это предложение" и удалить теги span с помощью grep. Как мне это сделать??
Я не хочу использовать awk | sed и все остальное, потому что я не знаком с ним. Спасибо!
Это ужасная идея. Вы не должны использовать молоток, чтобы делать отверстия, потому что вы не знаете, как работают силовые сверла.
Это сказало:
echo '<span class="cur_name">This is a sentence </span>' | \
grep -o '>[^<]*<' | grep -o '[^<>]*'
В общем, вы должны прислушаться к советам, данным @glenn jackmann и @that другим парнем: не разбирайте HTML с регулярными выражениями, в частности, используйте правильный инструмент для работы в целом.
В Linux вы можете использовать grep
с помощью PCRE (Perl-Compatible Regular Expressions), используя -P
.
Это позволяет использовать так называемые утверждения look-around для предоставления контекста для вашего желаемого соответствия без включения этого контекста в выходной файл.
Простейший случай (только совпадение между >
и <
):
echo '<span class="cur_name">This is a sentence </span>' |
grep -Po '(?<=>)[^<]*(?=<)'
(?<=>)
, утверждение look-behind - (?<=...)
-, match >
без включения его в совпадение.(?=<)
, прогнозное утверждение - (?=...)
-, соответствует <
без включения его в совпадение.Если вы хотите гибко сопоставлять окружающие теги, по типу:
Утверждения о взгляде ((?<=...)
) ограничены тем, что они должны иметь фиксированную длину. Таким образом, если вы хотите сопоставить любой открытый <span>
, независимо от атрибутов, вы можете использовать функцию \K
, которая просто отбрасывает часть совпадения слева от нее:
echo '<span class="cur_name">This is a sentence </span>' |
grep -Po '<span(\s+[^>]*)?>\K[^<]*(?=</span>)'
Наконец, чтобы дать вам представление о том, как легко разбираться в HTML/XML может быть с помощью правильных инструментов, здесь решение, основанное на многострочном (CN00) латинском web- scraping CLI xidel:
echo '<span class="cur_name">This is a sentence </span>' |
xidel -e '/span' -
Использование gnu grep
grep -Po '<span[^>]*>\K[^<]*' file
Вы можете использовать этот awk
awk '{gsub(/<[^>]*>/, " ");$1=$1}1' file
This is a sentence
Но самое короткое и, возможно, лучшее решение будет sed
sed 's/<[^>]\+>//g' file
This is a sentence
sed -e 's/<[^>]*>//g' t
This is a sentence