В GNUed
(примечание :изменяет file
на месте; для вывода отредактированного файла на стандартный вывод вместо этого измените wq
на,p q
):
printf '%s\n' 'g/^\(\|OTP \)XY:/m0' wq | ed -s file
Я решил проблему так
grep -rl "${isufx[@]}" -e "$ptrn" -- "${fdir[@]}" |
sed '1s/^/File: /;1!s/^/+ /' >> $logfl
Использование GNU rectools (, которые вы упоминаете в комментариях к другому из ваших вопросов):
: >output
recins -f File -v "$(cat logfile)" output
Это создает или очищает файл с именем output
, а затем вставляет одно поле с именем File
со значением, которое является содержимым файла logfile
.
Обратите внимание, что +
считается символом новой строки в формате GNU recfile, поэтому в приведенном выше примере вставляется одно значение , содержащее встроенные символы новой строки.
Если вы хотите вставить каждое имя файла как отдельный элемент, вы можете использовать
: >output
xargs -I {} recins -f File -v {} output <logfile
Вышеприведенный вызов recins
один раз на строку в logfile
и вставка отдельной пары значений ключа -для каждой.
Этого можно было бы добиться более эффективно, если бы входными данными был файл CSV:
{ echo File; cat logfile; } | csv2rec >output
Команда echo
используется здесь для добавления заголовка CSV к входным данным для csv2rec
.