Shell 使用sed或awk进行文本提取

Shell 使用sed或awk进行文本提取,shell,sed,grep,Shell,Sed,Grep,如何提取“title=Id:”和“”字符串之间的文本 我的剧本: #! /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')"

如何提取“title=Id:”和“”字符串之间的文本

我的剧本:

#! /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
没有前导或尾随空格

致以最良好的祝愿。
我已经有一个使用GRP.< /P> < P>的工作命令,首先,如果你的输入是HTML,你应该考虑使用HTML解析器。基于正则表达式的工具,如awk和sed,将无法处理任意HTML

但在您的特定示例中,这将起作用:

sed -ne 's/^.*title="Id: \([^"]*\)".*$/\1/p`
在您的代码中,grep有-Po选项,因此您可以直接使用grep获得结果

S='<TD WIDTH="15%"><a title="Id: A LA UNE HD" class="A3"></a></TD>'
grep -Po 'title="Id: \K[^"]+' <<< "$S"
以下是如何使用awk进行此操作


您编写的脚本利用了仅在bash中存在的特性,而不是传统的bourneshell。因此,shebang线应该是/bin/bash而不是/bin/sh.另外,您可以为延迟的评论做任何对不起的事,而不是printf%s$1 |无论如何,但是您的建议是针对bash的,在我的例子中,我使用的是sh而不是bash.fn_ExtractData{local DataField=$printf%s$1 | sed-ne's/^.'$2'[^'$3']*$$/\1/p'printf'%s'$DataField在我的嵌入式系统中,没有提供grep选项。使用sed,它现在可以正常工作。您应该始终使用双引号变量:
S='<TD WIDTH="15%"><a title="Id: A LA UNE HD" class="A3"></a></TD>'
grep -Po 'title="Id: \K[^"]+' <<< "$S"
grep -Po '(?<=title="Id: )[^"]*' <<< "$S"
awk -F'title="Id: ' '{split($2,a,"\"");print a[1]}' <<< "$S"
A LA UNE HD