Найти перекрытие / пересечение списков с Bash

section="SEE ALSO"
regex=$(sed 's/./&.*/g' <<<"$section")       # S.*E.*E.* .*A.*L.*S.*O.*
# then
some help command | sed -n '/^'"$regex"'/,/^[^[:blank:]]/ p' | sed '$d'
  • Регулярное выражение допускает любое количество символов между каждой буквой имени заданного раздела.
  • первая команда sed выводит только строки между заданным regex раздела и следующим разделом (я предполагаю, что все строки в разделе содержат пробельные символы)
  • вторая команда sed удаляет название раздела.

Как функция bash:

man_section() {
    local section=$1
    local regex=$(sed 's/./&.*/g' <<<"$section")
    sed -n '/^'"$regex"'/,/^[^[:blank:]]/ p' | sed '$d'
}

some help command | man_section "SEE ALSO"
0
18.08.2018, 01:21
2 ответа

Как насчет

for FN in ${first_list[@]}; do [[ ${second_list[@]} =~ $FN ]] && third_list+=($FN); done
1
28.01.2020, 02:23

Использование ассоциативного массива в качестве помощника для отслеживания элементов в одном списке (в качестве ключей ), а затем быстрая проверка элементов другого списка по этим:

#!/bin/bash

list1=( 1 3 5 6 7 8 bumble bee )
list2=( 2 4 4 4 6 7 8 bee beer )

declare -A seen

for item in "${list1[@]}"; do
    seen[$item]=1
done

for item in "${list2[@]}"; do
    if [ -n "${seen[$item]}" ]; then
        intersection+=( "$item" )
    fi
done

echo 'Intersection:'
printf '\t%s\n' "${intersection[@]}"

При этом используются точные совпадения строк для сравнения элементов между двумя списками.

Результат:

Intersection:
    6
    7
    8
    bee
2
28.01.2020, 02:23

Теги

Похожие вопросы