Сопоставление с образцом исключает дублирующиеся символы

Это - фундаментальное ограничение модели разрешения Unix: только корень может делегировать.

Вы не должны быть корнем для выполнения виртуальной машины (не верный для всех технологий VM), но это - тяжелое решение.

Непривилегированный режим Linux является относительно легким решением для виртуализации Linux на Linux. Дело не в этом легкий настроить; необходимо будет заполнить корневой раздел (в каталоге), по крайней мере, с минимумом, должен был загрузиться (несколько файлов в /etc, /sbin/init и его зависимости, программа входа в систему, оболочка и утилиты).

7
22.07.2011, 02:02
2 ответа

С регулярными выражениями в математическом смысле это возможно, но размер регулярных выражений растет экспоненциально относительно размера алфавита, таким образом, это не практично.

Существует простой путь с отрицанием и обратными ссылками.

grep '[spine]' | grep -Ev '([spine]).*\1'

Первое grep выбирает строки, которые содержат по крайней мере один из einps; второе grep строки отклонений, которые содержат больше чем одного из любого (например, разрешение spinal tap и spend но нет foobar или see).

4
27.01.2020, 20:19

Вдохновленный Вашим выражением, я могу придумать более короткое, с помощью 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

Возможно, я совершил ошибку, возможно, я делаю ошибку с переменным расширением.

1
27.01.2020, 20:19
  • 1
    См. мое отредактированное сообщение для желаемого вывода. Кроме того, я ищу решение, которое не требует сложной, утомительной, определенной для шаблона команды. –  Steven 22.07.2011, 02:06
  • 2
    Да, я вижу. Возможно, я нахожу способ произвести sed-команду из слова 'позвоночник'. –  user unknown 22.07.2011, 04:55
  • 3
    Наконец узнанный, как решить его с sed - который приемлем? –  user unknown 22.07.2011, 05:53

Теги

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