Ubuntu настраивает, проявляют для использования AppArmor, который препятствует тому, чтобы она получила доступ к определенным файлам даже при том, что файлы имеют соответствующие полномочия. Посмотрите Проявляют сбои для запуска, потому что это не может считать.Xauthority для другой, но связанной проблемы.
У Вас есть пользовательская установка TEX? Если так, проявите, вероятно, препятствует писать файлы шрифтов AppArmor. Посмотрите ошибку Ubuntu 846639, который показывает, как исправить конфигурацию AppArmor для Вашей системы.
Простое обходное решение должно просмотреть файл однажды в другом средстве просмотра такой как xdvi
, так, чтобы шрифты были сгенерированы. Затем проявите, сможет считать их. Или выполненный
allneeded L1.dvi
Можно выполнить команды allcm
и allec
генерировать некоторые общие шрифты.
, мы разберем содержимое этих двух строк:
$ grep -o '".*"' somefile | sed 's/"//g'
arch
arch2
Выше приведен поиск строки, соответствующей рисунку ".*"
. Это будет соответствовать всему, что происходит в двойных кавычках. Таким образом, grep
вернет эти типы значений:
"arch"
"arch2"
Труба в sed
удалит любые двойные кавычки из этих строк, давая строки, которые вы ищете. Нотация sed 's/"//g'
указывает sed
на поиск и замену всех случаев появления двойных кавычек, заменяя их ничем, s/"//g
. Команда s/find/replace/g
- это то, что там происходит, и трейлинг g
для поиска говорит ему сделать это глобально по всей заданной строке.
можно также использовать sed
, чтобы отрубить начальную двойную кавычку, оставить то, что между ними, и отрубить оставшуюся кавычку + все, что там после:
$ sed 's/^"\(.*\)".*/\1/' a
arch
arch2
$ grep -o '".*"' somefile | tr -d '"'
arch
arch2
Для удаления символов можно использовать команду tr
. В этом случае она удаляет двойные кавычки.
$ grep -oP '(?<=").*(?=")' somefile
arch
arch2
Используя функцию PCRE grep
вы можете искать любые подстроки, которые начинаются с двойной кавычки или заканчиваются двойной кавычкой и сообщать только о подстроках.
И здесь используется lookbehind через grep oneliner с опцией --perl-regexp
,
VBoxManage list vms | grep -oP '(?<=^\")[^"]*'
Explanation:
(?<=^\")[^"]*
-> Здесь используется lookbehind. Он совпадает с любым символом, но не с нулем "
или более раз (как только он находит двойные кавычки, он перестает совпадать), которые идут сразу после двойных кавычек (только строка, которая начинается с двойных кавычек).
Еще один некрасивый взлом через sed
,
$ sed '/.*\"\(.*\)\".*/ s//\1/g' file
arch
arch2
С помощью sed
можно сделать:
var=$(VBoxManage list vms | sed 's/^"\([^"]*\).*/\1/')
Объяснение:
s/.../.../
- совпадение и замена^
- совпадение в начале строки\(...\)
- это обратная ссылка, мы можем обратиться к тому, что сопоставлено здесь позже с \1
[^"]*
- соответствует любой последовательности, не содержащей "
(т.е. до следующей "
). *
- соответствовать остальной части строки\1
- заменить на обратную ссылку или на awk
:
var=$(VBoxManage list vms | awk -F\" '{ print $2 }')
Обратите внимание, что в современных оболочках вы также можете использовать массив вместо нормальной переменной. В bash
можно сделать:
IFS=$'\n'; set -f
array=( $(VBoxManage list vms | awk -F\" '{ print $2 }') )
echo "array[0] = ${array[0]}"
echo "array[1] = ${array[1]}"
Это может быть проще, когда вы придете к использованию переменной.
Используя бэш, я бы написал:
while read vm value; do
case $vm in
'"arch"') arch=$value ;;
'"arch2"') arch2=$value ;;
esac
done < <( VBoxManage list vms )
echo $arch
echo $arch2
поскольку регулярное выражение имеет жадный и не -жадный режимы, если у вас есть несколько целей в одной строке, оно не будет извлекаться так, как вы хотите. Линия:
"tom" is a cat, and "jerry" is a mouse.
Цель:
tom
jerry
Команда (жадный режим):
grep -oP '".*"' name
Команда (не -жадный режим):
grep -oP '".*?"' name