Это - фундаментальное ограничение модели разрешения Unix: только корень может делегировать.
Вы не должны быть корнем для выполнения виртуальной машины (не верный для всех технологий VM), но это - тяжелое решение.
Непривилегированный режим Linux является относительно легким решением для виртуализации Linux на Linux. Дело не в этом легкий настроить; необходимо будет заполнить корневой раздел (в каталоге), по крайней мере, с минимумом, должен был загрузиться (несколько файлов в /etc
, /sbin/init
и его зависимости, программа входа в систему, оболочка и утилиты).
С регулярными выражениями в математическом смысле это возможно, но размер регулярных выражений растет экспоненциально относительно размера алфавита, таким образом, это не практично.
Существует простой путь с отрицанием и обратными ссылками.
grep '[spine]' | grep -Ev '([spine]).*\1'
Первое grep
выбирает строки, которые содержат по крайней мере один из einps
; второе grep
строки отклонений, которые содержат больше чем одного из любого (например, разрешение spinal tap
и spend
но нет foobar
или see
).
Вдохновленный Вашим выражением, я могу придумать более короткое, с помощью egrep:
egrep -v '(s.*s|p.*p|i.*i|n.*n|e.*e)' FILE
который эквивалентен
sed /s.*s/d;/p.*p/d;/i.*i/d;/n.*n/d;/e.*e/d; FILE
И это - то, как произвести sed-команду из входа автоматически:
#!/bin/bash
word=$1
file=$2
expr=$(for c in $(echo $word | sed 's/./& /g'); do echo -n "/"$c".*"$c"/d;"; done);
sed $expr $file
Я попробовал аналогичный подход grep, но не мог убедить оболочку брать grep-шаблон от переменной, но если я повторил его и вставил результат с вырезанным и вставленным, команда работала:
expr="'("$(for c in $(echo $wort | sed 's/./& /g'); do echo -n $c".*"$c"|"; done)
egrep -v ${expr/%|/)\'} FILE
# doesn't work, filters nothing, whole file is printed
# check:
echo egrep -v $(echo $exp) FILE
egrep -v '(s.*s|p.*p|i.*i|n.*n|e.*e)' FILE
# manually:
egrep -v '(s.*s|p.*p|i.*i|n.*n|e.*e)' FILE
spine
spin
pine
Возможно, я совершил ошибку, возможно, я делаю ошибку с переменным расширением.