Используя sed, чтобы удалить линии из переменной списка

Есть несколько вариантов. Если это ваш единственный фоновый процесс, вы можете легко убить его с помощью

kill %1

. Вы можете сохранить PID подоболочки:

myFunc &
myFunc_PID=$!
[...]
kill -HUP "$myFunc_PID"

Вы также можете использовать

kill %myFunc

. Имеет смысл поместить убийство подоболочки в обработчик EXIT:

trap 'kill %myFunc' EXIT
3
24.01.2019, 04:08
4 ответа

Если вы можете аккуратно назначать слова в list, вы можете использовать расширение параметра bash, чтобы заменить каждый пробел генератором регулярных выражений |, а затем попросить grepсделать эту работу за вас:

list='auditd the to'
cp file temp &&  
grep -Ev "${list// /|}" temp > file && 
rm temp 
1
27.01.2020, 21:24

Запустив sedтолько один раз и используя один sedскрипт, а не вызывая миллион строк в -команд один -на -один:

sedscript=$(mktemp)
for i in $list; do
  echo "/$i/d" >> "$sedscript"
done
sed -f "$sedscript" -i /path/to/file
rm -f "$sedscript"
2
27.01.2020, 21:24

Если ваша оболочка поддерживает массивы, вы можете сделать что-то вроде

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, за исключением того, что оно не использует временный файл сценария (и должно обрабатывать пробелы в полях таблицы, если это необходимо ).

0
27.01.2020, 21:24

Если это: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
0
27.01.2020, 21:24

Теги

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