sed '/^Start-Date:/ {N; /\n$/d}'
sed's Потоковый Редактор, хлебайте/определять стаи строки и имейте свой путь с ними.
N
"добавляют новую строку и следующую входную строку к текущему буферу", таким образом, \n
в буфере запуск добавленной строки /\n$/d
означает, "если последняя добавленная строка в буфере пуста, просто отбрасывают все это".
У вас есть команды, поэтому вставьте их в сценарий!
Чтобы запустить набор команд для разных данных, поместите изменяющиеся данные в переменную .
Чтобы запустить gcov
и mv
для всех файлов, есть несколько возможных методов, в том числе:
gcov
для всех файлов, затем переместите их. gcov
для одного файла, затем переместите его вывод. gconv
для файлов в каталоге, затем переместите их. Первый подход не работает, потому что gcov
необходимо выполнить в каталоге, содержащем исходные файлы. Третий подход, основанный на каталогах, на самом деле является наиболее сложным из трех: простейшим методом было бы запускать gcov
для одного файла за раз.
В bash вы можете рекурсивно перечислить все файлы C в каталоге и его подкаталогах с помощью шаблона подстановки ** / *. C
.Подстановочный знак **
должен быть включен с параметром globstar
опцией . Для перебора файлов используйте цикл for
.
Чтобы перейти в каталог только для выполнения одной команды, запустите cd
и эту команду в подоболочке : (cd… && gcov…)
.
Вам нужен еще один тип конструкции оболочки: небольшая манипуляция с именами файлов для извлечения части каталога. расширение параметра конструкция $ {x% / *}
расширяется до значения переменной x
с самым коротким суффиксом, соответствующим шаблону / *
удалено. Другими словами, это часть каталога имени файла, хранящаяся в x
. Это не сработало бы, если бы x
состоял только из имени файла без части каталога (то есть foo
в отличие от bar / foo
); так случилось, что в корне дерева исходных текстов OpenSSL нет файла .c
, но есть простой способ убедиться, что имя файла начинается с ./
, обозначающего текущий каталог .
Вызовите этот сценарий в корне дерева исходных текстов OpenSSL после запуска ./ config
с желаемыми параметрами.
#!/bin/bash
shopt -s globstar
gcov_data_dir="../../gcovdata/${PWD##*/}"
make
make tests
for x in ./**/*.c; do
mkdir -p "$gcov_data_dir/${x%/*}"
(cd "${x%/*}" && gcov "${x##*/}") &&
mv "$x.gcov" "$gcov_data_dir/${x%/*}"
done
Чтобы избежать необходимости перемещать файлы .gcov
, альтернативным подходом было бы создание леса символических ссылок на каталог компиляции и запуск gcov
в gcovdata
каталог. С GNU coreutils (т.е. на невстроенном Linux или Cygwin) вы можете сделать это с помощью cp -al
.
cp -al openssl-1.0.0 gcovdata
cd gcovdata
for x in ./**/*.c; do
(cd "${x%/*}" && gcov "${x##*/}")
done
После запуска вашего gcov просто сделайте это:
mv *.gcov sub-folder-name
mv *.gcda sub-folder-name
mv *.gcno sub-folder-name