Вот несколько вариантов, ни один из которых не использует sed
. Я нахожу что в целом, пытаясь добраться sed
играть по правилам с внешними переменными редко стоит усилия.
for file in "${filelist[@]}"; do
tmp=$(mktemp);
printf "%s\n%s\n%s\n" "$prefix" $(cat "$file") "$suffix" > "$tmp" &&
mv "$tmp" "$file";
done
for file in "${filelist[@]}"; do
tmp=$(mktemp);
perl -lpe 'BEGIN{print $ENV{prefix}}END{print $ENV{suffix}}' $file
mv "$tmp" "$file";
done
Этот имеет преимущество не доверия внешним модулям:
perl -le 'foreach (@ARGV){
open($f,"+<","$_"); @a=<$f>;
print $f "$ENV{suffix}\n@a$ENV{prefix}"
}' "${filelist[@]}"
Переменные должны быть экспортированы для решений для Perl работать, иначе, они не будут доступны в %ENV
хеш.
Для этого нужно понимать основы регулярных выражений. Модификатор *
не означает 'все', как это часто предполагается. Звездочка имеет такое значение в shell, но это что-то другое, не regex. *
означает: взять предыдущий символ (или группу символов, если перед ним стоит []
группа) и попытаться найти ему соответствие от нуля до неограниченного числа вхождений.
Итак, что вы проверяете с помощью myapp_*.jar
, так это наличие в списке процессов любого из следующих символов:
myapp.jar myapp_.jar myapp__.jar myapp___.jar ...
Видите, что я имею в виду? Это никак не совпадает с 'myapp_v.01.jar'. Если вы хотите подобрать любой символ, вам понадобится .
. Так что ваш regex для pkill
может быть таким: myapp_*.*.jar