2014-12-07 104 views
-1

如何提取'title =「Id:'和'''字符串之間的文本。使用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 shell。因此,shebang行應該是'#!/bin/bash'而不是'#! /斌/ sh'。 – 2014-12-07 01:47:18

+0

此外,而不是'printf%s「$ 1」|無論如何,你可以做任何<<<「$ 1」'。 '<<<'* string *構造被稱爲[here-string](http://www.gnu.org/software/bash/manual/html_node/Redirections.html#Here-Strings)。 – 2014-12-07 02:11:56

+0

對不起,延遲的評論,但你的建議是特定於bash,在我的情況下我使用sh不bash。 – user3072470 2014-12-07 08:06:23

回答

1

首先,如果您的輸入是HTML,則應考慮使用HTML解析器。基於正則表達式的工具如awksed將無法​​處理任意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「 }起首適用。 – user3072470 2014-12-07 01:59:41

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 2014-12-07 02:02:51

+0

您應該始終使用雙引號變量:'<<<「$ S」' – Jotne 2014-12-07 08:54:43

0

以下是如何使用awk

awk -F'title="Id: ' '{split($2,a,"\"");print a[1]}' <<< "$S" 
A LA UNE HD