我正在使用hxselect在bash中处理HTML文件。
在此文件中,使用'.row'类定义了多个div。
在bash中,我想将这些“行”提取到数组中。 (div是多行的,因此仅逐行读取是不合适的。)
有可能实现这一目标吗? (使用基本工具,awk,grep等)
将行分配给数组后,我想进一步处理它:
for row in ROWS_EXTRACTED; do
PROCESS1($row)
PROCESS2($row)
done
谢谢!
答案 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>