Есть несколько вариантов. Если это ваш единственный фоновый процесс, вы можете легко убить его с помощью
kill %1
. Вы можете сохранить PID подоболочки:
myFunc &
myFunc_PID=$!
[...]
kill -HUP "$myFunc_PID"
Вы также можете использовать
kill %myFunc
. Имеет смысл поместить убийство подоболочки в обработчик EXIT:
trap 'kill %myFunc' EXIT
Если вы можете аккуратно назначать слова в list
, вы можете использовать расширение параметра bash, чтобы заменить каждый пробел генератором регулярных выражений |
, а затем попросить grep
сделать эту работу за вас:
list='auditd the to'
cp file temp &&
grep -Ev "${list// /|}" temp > file &&
rm temp
Запустив sed
только один раз и используя один sed
скрипт, а не вызывая миллион строк в -команд один -на -один:
sedscript=$(mktemp)
for i in $list; do
echo "/$i/d" >> "$sedscript"
done
sed -f "$sedscript" -i /path/to/file
rm -f "$sedscript"
Если ваша оболочка поддерживает массивы, вы можете сделать что-то вроде
mapfile -t arr < <(psql -d dbname -t -c "SELECT foo from table ORDER BY column DESC")
чтобы поместить вывод команды в массив оболочки, затем
printf '/%s/d\n' "${arr[@]}" | sed -i.bak -f - somefile
, чтобы применить последовательность удалений к somefile
, на месте. Обычные предостережения применяются, если поля, возвращаемые вашей командой psql
, могут содержать специальные символы для sed
.
Это похоже на решение @DopeGhoti, за исключением того, что оно не использует временный файл сценария (и должно обрабатывать пробелы в полях таблицы, если это необходимо ).
Если это:psql -d dbname -t -c "SELECT foo from table ORDER BY column DESC"
дает вам белый -список слов, разделенных пробелами, попробуйте это:
$ psql -d dbname -t -c "SELECT foo from table ORDER BY column DESC" \
| awk -v FS=" " -v OFS="|" '{$1=$1; print "("$0")"}' \
| xargs -I {} sed -i -E '/{}/d' file