Удалите несколько регулярных выражений из переменной с помощью sed

Вы не можете сделать это, пока не разрешите show-stopper, "Переключатели виртуализации на ноутбуке в данный момент отключены в BIOS, и я не могу это изменить".

После этого вы можете использовать KVM (и, возможно, другие системы виртуализации) для запуска Windows на виртуальной машине, даже если она все еще установлена ​​в физических разделах вашего диска. (Я не могу подтвердить, справится ли Windows с заменой действующего оборудования под ней. Вы можете столкнуться с тем, что ваша лицензия на ОС Windows будет заблокирована, потому что вы сразу изменили «слишком много» оборудования. Будьте осторожны.)

1
02.02.2017, 03:09
2 ответа

Как отмечали другие, есть несколько лучших способов определить природу PID 1. Использование нескольких вызовов использование grep , sed и awk в одном конвейере почти никогда не является хорошей идеей. Если grep не может этого сделать, используйте sed . Если sed не может этого сделать (легко), используйте awk . Отсюда:

stat /proc/1/exe | sed -n '/File:/{s/.*-> *[\xe2\x80\x98]//;s/[\xe2\x80\x99].*//p;q}'
0
28.01.2020, 01:02

Здесь может быть использован несколько иной подход, который по-прежнему отвечает первоначальному вопросу "как объединить три команды sed в одну", а также улучшает саму команду. Несомненно, существует множество других подходов к решению вторичного вопроса о том, как извлечь систему init.

Вместо того, чтобы пытаться вычеркнуть то, что вам не нужно, вы можете захватить то, что вам нужно, с помощью групп захвата, и вы можете подобрать несколько значений, используя наборы символов. Набор символов обозначается скобками "[ ]". Внутри них вы помещаете именно то, что хотите сопоставить, и получаете неявный оператор OR между ними. Так, для соответствия левой кавычки И апострофу вы используете:

[\xe2\x80\x98 \x27]

Левая кавычка - это шестнадцатеричный символ "e28098", а апостроф - шестнадцатеричный символ "27". Я поставил между ними пробел, чтобы подчеркнуть, что это два отдельных символа, но технически это будет соответствовать левой кавычке ИЛИ пробелу ИЛИ апострофу. Удалите пробел, если не хотите, чтобы он совпадал. Вы можете также добавить "e28099", если хотите, чтобы совпадала правая цитата.

Чтобы улучшить саму команду и просто подтянуть либо "init", либо "systemd", можно использовать другой подход, используя группы захвата. Группы захвата обозначаются скобками "( )". Затем вы можете ссылаться на эту группу захвата. Например, я использовал эту команду для захвата именно того, что мне было нужно:

stat /proc/1/exe | sed -rn 's/^.*File:.*->.*[\xe2\x80\x98\x27]\/.*\/(.+)[\xe2\x80\x99\x27]$/\1/p'

Группа захвата (".+" между скобками) захватывает все, что находится после последней прямой косой черты, которая находится между левой кавычкой или апострофом и правой кавычкой или апострофом. На нее ссылаются, используя "\1" (поскольку это первая и единственная группа захвата). Sed заменяет всю строку только тем, что находится в группе захвата.

  • -r используется для расширенных регулярных выражений (по крайней мере, в моей версии sed)
  • -n используется для подавления печати. В сочетании с опцией "/p" он будет печатать только строки, соответствующие шаблону, но после того, как они будут заменены. Это делает sed похожим на grep.

Надеюсь, это поможет кому-нибудь еще.

0
28.01.2020, 01:02

Теги

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