【问题标题】:Extract a substring (value of an HTML node tag) in a bash/zsh script在 bash/zsh 脚本中提取子字符串(HTML 节点标记的值)
【发布时间】:2019-12-09 18:27:45
【问题描述】:

我正在尝试提取变量中已有的 HTML 节点的标记值。 我目前正在使用 Zsh,但我也在尝试让它在 Bash 中工作。

当前变量的值为:

<span class="alter" fill="#ffedf0" data-count="0" data-more="none"/>

我想获得 data-count 的值(在本例中为 0,但可以是任何长度的整数)。

我已尝试使用 cut、sed 和变量扩展,如 this question 中所述,但我没有设法调整正则表达式,或者可能必须对 Zsh 进行不同的处理。

【问题讨论】:

  • 不要使用正则表达式解析 XML/HTML,而是使用适当的解析器。

标签: bash zsh


【解决方案1】:

请您尝试关注一下。

awk 'match($0,/data-count=[^ ]*/){print substr($0,RSTART+12,RLENGTH-13)}' Input_file

解释: 使用awkmatch 函数来匹配正则表达式data-count=[^ ]* 意味着匹配从数据计数到出现空格的所有内容,如果这个正则表达式是TRUE(找到匹配项)然后设置开箱即用变量 RSTARTRLENGTH。稍后我将根据这些变量值打印当前行的子字符串以仅获取 data-count 的值。


sed 可以尝试关注一下吗?

sed 's/.*data-count=\"\([^"]*\).*/\1/'  Input_file

解释: 使用sed 的组引用能力并在data-count=\" 之后的第一个组中保存正则表达式值,这是它的长度,然后因为使用@987654332 @(substitution) with sed 所以提到1 将全部替换为\1(在临时内存中匹配正则表达式值,组引用)。

【讨论】:

  • 刚刚检查并适应了脚本中的管道,awk 和 sed 都在 zsh 和 bash 中工作。我会将第一个标记为正确答案,因为它也可以正常工作。
  • @CarlosAS,Np,我很高兴能够帮助你,干杯。
【解决方案2】:

sed 没有理由在这种情况下不起作用。对于您的具体情况,我会这样做:

sed 's/.*data-count="\([0-9]*\)".*/\1/g' file_name.txt

基本上,它只是声明sed 正在寻找包含data-count= 的模式,然后将括号\(...\) 中的所有内容保存到\1,随后打印出来代替匹配项(整行由于.*)

【讨论】:

    【解决方案3】:

    如前所述,为了安全起见并处理任何语法上有效的 HTML 标记,强烈建议使用解析器。但是,如果您事先知道 HTML 元素的一般格式是什么样的,那么下面的 hack 可能会派上用场:

    假设您的变量名为“html”

    html='<span class="alter" fill="#ffedf0" data-count="0" data-more="none"/>'
    

    先适应一下:

    htmlx="tag ${html%??}"
    

    这将在前面添加字符串tag并删除最后的/&gt;

    现在创建一个关联数组:

    declare -A fields
    fields=( ${=$(tr = ' ' <<<$htmlx)} )
    

    tr 将等号转换为空格,${= 处理分词。您现在可以通过

    来访问属性的值
    echo $fields[data-count]
    

    请注意,这仍然有周围的双引号。 Yuo 可以通过

    轻松删除它们
    echo ${${fields[data-count]%?}#?}
    

    当然,一旦你做了这个 hack,你就可以以同样的方式访问所有属性。

    【讨论】:

      猜你喜欢
      • 2019-02-15
      • 2012-09-24
      • 2017-02-05
      • 1970-01-01
      • 2018-12-28
      • 2011-10-26
      • 2021-10-31
      相关资源
      最近更新 更多