Как удалить теги span, используя grep в bash?

0
<span class="cur_name">This is a sentence </span>

Я хотел просто получить часть "Это предложение" и удалить теги span с помощью grep. Как мне это сделать??

Я не хочу использовать awk | sed и все остальное, потому что я не знаком с ним. Спасибо!

Теги:
grep

4 ответа

4
Лучший ответ

Это ужасная идея. Вы не должны использовать молоток, чтобы делать отверстия, потому что вы не знаете, как работают силовые сверла.

Это сказало:

echo '<span class="cur_name">This is a sentence </span>' | \
    grep -o '>[^<]*<' | grep -o '[^<>]*'
  • 0
    + вероятно лучше чем *
  • 1
    +1 за здравый совет.
2

В общем, вы должны прислушаться к советам, данным @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' -
1

Использование gnu grep

grep -Po '<span[^>]*>\K[^<]*' file
0

Вы можете использовать этот 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню