如何使用hxselect生成类似数组的结果?

时间:2019-01-05 09:32:02

标签: bash html-xml-utils

我正在使用hxselect在bash中处理HTML文件。

在此文件中,使用'.row'类定义了多个div。

在bash中,我想将这些“行”提取到数组中。 (div是多行的,因此仅逐行读取是不合适的。)

有可能实现这一目标吗? (使用基本工具,awk,grep等)

将行分配给数组后,我想进一步处理它:

for row in ROWS_EXTRACTED; do
PROCESS1($row)
PROCESS2($row)
done

谢谢!

2 个答案:

答案 0 :(得分:0)

一种可能性是将标签的内容放在一个数组中,并且每个项目都用引号引起来。例如:

# Create array with " " as separator
array=`cat file.html | hxselect -i -c -s '" "' 'div.row'`
# Add " to the beginning of the string and remove the last
array='"'${array%'"'}

然后,在for循环中处理

for index in ${!array[*]}; do printf "  %s\n\n" "${array[$index]}"; done

如果标签包含引号字符,另一种解决方案是放置在标签内容中找不到的分隔符(在我的示例中为§):

array=`cat file.html | hxselect -i -c -s '§' 'div.row'`

然后用awk进行治疗:

# Keep only the separators to count them with ${#res}
res="${array//[^§]}"
for (( i=1; i<=${#res}; i++ ))
do
    echo $array2 | awk -v i="$i" -F § '{print $i}'
    echo "----------------------------------------"
done

答案 1 :(得分:0)

以下内容指示hxselect用制表符分隔匹配项,删除所有换行符,然后将制表符分隔符转换为换行符。这使您可以使用read将div迭代为一行:

#!/bin/bash

divs=$(hxselect -s '\t' .row < "$1" | tr -d '\n' | tr '\t' '\n')

while read -r div; do
    echo "$div"
done <<< "$divs"

给出以下测试输入:

<div class="container">
  <div class="row">
    herp
    derp
  </div>
  <div class="row">
    derp
    herp
  </div>
</div>

结果:

$ ./test.sh test.html
<div class="row">    herp    derp  </div>
<div class="row">    derp    herp  </div>