pkill с регулярным выражением

Вот несколько вариантов, ни один из которых не использует sed. Я нахожу что в целом, пытаясь добраться sed играть по правилам с внешними переменными редко стоит усилия.

Shell

for file in "${filelist[@]}"; do 
  tmp=$(mktemp); 
  printf "%s\n%s\n%s\n" "$prefix" $(cat "$file") "$suffix" > "$tmp" && 
  mv "$tmp" "$file"; 
done

Perl/Shell

for file in "${filelist[@]}"; do 
  tmp=$(mktemp); 
  perl -lpe 'BEGIN{print $ENV{prefix}}END{print $ENV{suffix}}' $file 
  mv "$tmp" "$file"; 
done

Чистый Perl

Этот имеет преимущество не доверия внешним модулям:

perl -le 'foreach (@ARGV){
           open($f,"+<","$_"); @a=<$f>; 
           print $f "$ENV{suffix}\n@a$ENV{prefix}"
          }' "${filelist[@]}"

Примечание:

Переменные должны быть экспортированы для решений для Perl работать, иначе, они не будут доступны в %ENV хеш.

2
07.10.2015, 12:59
1 ответ

Для этого нужно понимать основы регулярных выражений. Модификатор * не означает 'все', как это часто предполагается. Звездочка имеет такое значение в shell, но это что-то другое, не regex. * означает: взять предыдущий символ (или группу символов, если перед ним стоит [] группа) и попытаться найти ему соответствие от нуля до неограниченного числа вхождений.

Итак, что вы проверяете с помощью myapp_*.jar, так это наличие в списке процессов любого из следующих символов:

myapp.jar
myapp_.jar
myapp__.jar
myapp___.jar
...

Видите, что я имею в виду? Это никак не совпадает с 'myapp_v.01.jar'. Если вы хотите подобрать любой символ, вам понадобится . . Так что ваш regex для pkill может быть таким: myapp_*.*.jar

3
27.01.2020, 22:05

Теги

Похожие вопросы