Похоже, вы хотите получить целое число N
в имени файла begin-N.end
для каждого такого имени файла, содержащего строку stringToBeSearched
.
Это можно сделать в простом цикле:
for filename in begin-*.end; do
if grep -qF 'stringToBeSearched' "$filename"; then
N=${filename%.end}
N=${N#begin-}
printf '%s\n' "$N"
fi
done
Дело в том, что мы не перебираем текст . Текст, содержащий имена файлов (, что является выводом grep -l
), очень плохо кодирует все возможные имена файлов в системе Unix, особенно имена файлов, содержащие символы новой строки.
Вместо этого мы позволяем шаблону глобуса begin-*.end
расшириться до правильного списка и перебираем его, проверяя каждый элемент списка с помощью grep
, а затем извлекая целое число, когда находим совпадение.
Очевидно, что вы могли бы обернуть это в функции, если хотите:
test_files () {
local func="$1"; shift
local string="$1"; shift
# Looks for the string "$string" in all given files.
# Calls "$func" with each pathname that contains the string.
for pathname do
if grep -qF "$string" "$pathname"; then
"$func" "$pathname"
fi
done
}
foo () {
# Takes a string on the form "begin-N.end" and
# extracts and prints "N".
local tmp="${1%.end}"
printf '%s\n' "${tmp#begin-}"
}
test_files foo stringToBeSearched begin-*.end
Это более или менее использует простую форму «обратного вызова», посредством которой foo
вызывается test_files
для каждого файла, содержащего определенную строку.