1

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

在这个文件中,有多个用 '.row' 类定义的 div。

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

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

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

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

谢谢!

4

2 回答 2

0

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

#!/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>
于 2019-01-06T00:05:54.847 回答
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
于 2019-01-05T12:20:57.613 回答