Как я могу использовать hxselect для генерации результата массива?
Я использую hxselect для обработки HTML-файла в bash.
В этом файле есть несколько элементов div, определенных с помощью класса.row.
В bash я хочу извлечь эти "строки" в массив. (DIV многопоточны, поэтому простое чтение построчно не подходит.)
Возможно ли этого добиться? (С основными инструментами, awk, grep и т. Д.)
После присвоения строк массиву я хочу продолжить его обработку:
for row in ROWS_EXTRACTED; do
PROCESS1($row)
PROCESS2($row)
done
Спасибо!
2 ответа
Одна возможность - поместить содержимое тегов в массив, каждый элемент которого должен быть заключен в кавычки. Например:
# 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
Следующие инструкции 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>