2025-07-25 19:02:35
#ok
#!/bin/bash
show_help() {
cat <<EOF
Использование: $0 -f input_file "слово1 слово2 ..."
Ищет секции в файле (каждая начинается строкой [...]),
выводит только те, где встречаются все указанные слова как полные слова (без учёта регистра).
EOF
}
while getopts ":f:h" opt; do
case $opt in
f) input_file="$OPTARG" ;;
h) show_help; exit 0 ;;
\?) echo "Неизвестная опция -$OPTARG" >&2; show_help; exit 1 ;;
:) echo "Опция -$OPTARG требует аргумент" >&2; show_help; exit 1 ;;
esac
done
shift $((OPTIND-1))
search_words="$1"
if [[ -z "$input_file" || -z "$search_words" ]]; then
echo "Ошибка: укажите входной файл (-f) и слова для поиска."
show_help
exit 1
fi
if [[ ! -f "$input_file" ]]; then
echo "Ошибка: файл '$input_file' не найден."
exit 2
fi
awk -v words="$search_words" '
function check_words_in_section(section, words_array, len, i, word, pattern) {
section_l = tolower(section)
for (i = 1; i <= len; i++) {
word = tolower(words_array[i])
pattern = "(^|[^[:alnum:]_])" word "([^[:alnum:]_]|$)"
if (section_l !~ pattern) return 0
}
return 1
}
BEGIN {
len = split(words, search_words, " ")
section = ""
in_section = 0
}
/^\[.*\]$/ {
if (in_section && check_words_in_section(section, search_words, len)) print section
section = $0 "\n"
in_section = 1
next
}
{
if (in_section) section = section $0 "\n"
}
END {
if (in_section && check_words_in_section(section, search_words, len)) print section
}
' "$input_file"
Back to list