2014-12-07 6 views
-1

Как извлечь текст betwenn 'title = "Id:' и '' 'strings.Удаление текста с помощью sed или awk

Мой сценарий:

#! /bin/sh 

S='<TD WIDTH="15%"><a title="Id: A LA UNE HD" class="A3"></a></TD>' 

fn_ExtractData() { 
        local DataField="$(printf %s "$1" | sed -n -e '/'"$2"'/,/'"$3"'/p')" 
        #local DataField="$(printf %s "$1" | grep -oP '(?<='"$2"').*?(?='"$3"')')" 
        printf '%s' "$DataField" 
} 
ptr1='title="Id: ' 
ptr2='"' 
rslt="$(fn_ExtractData "$S" "$ptr1" "$ptr2")" 
echo "$rslt" 
exit 

выход ожидается:

A LA UNE HD 

без передней или задней пробелов.

С наилучшими пожеланиями. PS. У меня уже есть рабочая команда, использующая grep.

+0

В написанном вами сценарии используются функции, которые присутствуют только в bash, а не в традиционной оболочке Bourne. Таким образом, строка shebang должна быть '#!/bin/bash' вместо '#!/Бен/sh'. –

+0

Кроме того, вместо 'printf% s" $ 1 "| независимо от того, вы можете просто сделать что-нибудь <<< "$ 1" '. Строка '<<<' * string * называется [here-string] (http://www.gnu.org/software/bash/manual/html_node/Redirections.html#Here-Strings). –

+0

Извините за отложенный комментарий, но то, что вы предлагаете, относится к bash, в моем случае я использую sh not bash. – user3072470

ответ

1

Во-первых, если ваш ввод HTML, вам следует рассмотреть возможность использования парсера HTML. Инструменты на основе регулярных выражений, такие как awk и sed, не смогут обрабатывать произвольный HTML.

Но в вашем конкретном примере, это будет работать:

sed -ne 's/^.*title="Id: \([^"]*\)".*$/\1/p` 
+0

fn_ExtractData() { local DataField = "$ (printf% s" $ 1 "| sed -ne 's /^.*'"$ 2"' \ ([^ '"$ 3"'] * \) '"$ 3" '. * $/\ 1/p') " printf '% s'" $ DataField " } Chapeau работает. – user3072470

1

В вашем коде, Grep имеет -Po вариант, так что вы можете получить результат непосредственно Grep

S='<TD WIDTH="15%"><a title="Id: A LA UNE HD" class="A3"></a></TD>' 
grep -Po 'title="Id: \K[^"]+' <<< "$S" 

Если вы не» t нравится \K вариант:

grep -Po '(?<=title="Id:)[^"]*' <<< "$S" 
+0

В моей встроенной системе опция grep «P» не поставляется. С sed он работает без проблем. – user3072470

+0

Вы всегда должны использовать двойную кавычку: '<<< '$ S" ' – Jotne

0

Вот как это сделать с помощью awk

awk -F'title="Id: ' '{split($2,a,"\"");print a[1]}' <<< "$S" 
A LA UNE HD 
Смежные вопросы