Как я извлекаю содержание заключенных в кавычки строк от вывода команды?

Ubuntu настраивает, проявляют для использования AppArmor, который препятствует тому, чтобы она получила доступ к определенным файлам даже при том, что файлы имеют соответствующие полномочия. Посмотрите Проявляют сбои для запуска, потому что это не может считать.Xauthority для другой, но связанной проблемы.

У Вас есть пользовательская установка TEX? Если так, проявите, вероятно, препятствует писать файлы шрифтов AppArmor. Посмотрите ошибку Ubuntu 846639, который показывает, как исправить конфигурацию AppArmor для Вашей системы.

Простое обходное решение должно просмотреть файл однажды в другом средстве просмотра такой как xdvi, так, чтобы шрифты были сгенерированы. Затем проявите, сможет считать их. Или выполненный

allneeded L1.dvi

Можно выполнить команды allcm и allec генерировать некоторые общие шрифты.

27
15.06.2014, 02:21
6 ответов

Используя grep + sed

, мы разберем содержимое этих двух строк:

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

$ sed 's/^"\(.*\)".*/\1/' a
arch
arch2

Другие методы

$ grep -o '".*"' somefile | tr -d '"'
arch
arch2

Для удаления символов можно использовать команду tr. В этом случае она удаляет двойные кавычки.

$ grep -oP '(?<=").*(?=")' somefile
arch
arch2

Используя функцию PCRE grep вы можете искать любые подстроки, которые начинаются с двойной кавычки или заканчиваются двойной кавычкой и сообщать только о подстроках.

35
27.01.2020, 19:39

Это еще одна работа для cut:

VBoxManage list vms | cut -d \" -f2
19
27.01.2020, 19:39

И здесь используется lookbehind через grep oneliner с опцией --perl-regexp,

VBoxManage list vms | grep -oP '(?<=^\")[^"]*'

Explanation:

(?<=^\")[^"]* -> Здесь используется lookbehind. Он совпадает с любым символом, но не с нулем " или более раз (как только он находит двойные кавычки, он перестает совпадать), которые идут сразу после двойных кавычек (только строка, которая начинается с двойных кавычек).

Еще один некрасивый взлом через sed,

$ sed '/.*\"\(.*\)\".*/ s//\1/g' file
arch
arch2
5
27.01.2020, 19:39

С помощью 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]}"

Это может быть проще, когда вы придете к использованию переменной.

7
27.01.2020, 19:39

Используя бэш, я бы написал:

while read vm value; do
    case $vm in
        '"arch"') arch=$value ;;
        '"arch2"') arch2=$value ;;
    esac
done < <( VBoxManage list vms )
echo $arch
echo $arch2
5
27.01.2020, 19:39

поскольку регулярное выражение имеет жадный и не -жадный режимы, если у вас есть несколько целей в одной строке, оно не будет извлекаться так, как вы хотите. Линия:

"tom" is a cat, and "jerry" is a mouse. 

Цель:

tom
jerry

Команда (жадный режим):

grep -oP '".*"' name

Команда (не -жадный режим):

grep -oP '".*?"' name
2
27.01.2020, 19:39

Теги

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