Вы можете использоватьbase64
:
$ VAR="1/
,x"
$ echo "$VAR" | base64 > f
$ VAR=$(cat f | base64 -d)
$ echo "${VAR}X"
1/
,xX
использовать подстановку процесса и передавать в цикл только строки с именами файлов (вместо всего файла)
while IFS= read -r fl; do
grep --color -ni -C 8 -e "$ptrn" -- "$fl"
done < <(grep -o '/.*' "$logfl")
или обрабатывать весь файл, но пропуская строку за строкой до тех пор, пока не появится ключевое слово File:
, затем обрабатывать строку за строкой с манипуляциями со строками /${fl#*/}
, пока не исчезнет ключевое слово +
, затем прекратить чтение
# some control flags
begin=
exit=continue
while IFS= read -r fl; do
case ${fl%[[:blank:]]*} in
*File:*)
begin=start
;;
*+*)
exit=break
;;
*)
$exit
;;
esac
[ "$begin" ] && \
grep --color -ni -C 8 -e "$ptrn" -- "/${fl#*/}"
done < "$logfl"
В комментариях к вопросу вы упомянули, что поместили эти данные в формат, читаемый набором инструментов GNU recutils
.
Давайте воспользуемся этими инструментами для извлечения путей и вызоваgrep
:
recsel -P File -- "$logfl" | xargs -I {} grep -e "$ptrn" -- {}
Выбирает и печатает значения, связанные с полем File
в файле с именем $logfl
. Для каждой строки, созданной командой recsel
, xargs
вызывает grep
для извлечения строк, соответствующих основному регулярному выражению в $ptrn
.
Обратите внимание, что в вопросе у вас есть одиночное значение, содержащее встроенные символы новой строки.
Если бы у вас был файл записи с несколькими полями File
с отдельными значениями, вы бы вместо этого использовали
recsel -C -P File -- "$logfl" | xargs -I {} grep -e "$ptrn" -- {}