Intereting Posts
Может ли <Местоположение /> быть для нескольких виртуальных хостов в httpd.conf? Помогите диагностировать очень медленный сеанс Remmina для виртуальной виртуальной машины VM gunzip от stdin Как найти все изображения, содержащие любой текст? Как подключить логически отключенное USB-устройство? Не удается установить Ubuntu, поскольку ПК продолжает закрывать Блочное устройство исчезает после приостановки-возобновления Скрыть файл .tar .ext3 Получение обновления об ошибке CentOS 6.7 Почему не поддерживается соблюдение только параметра «Только для чтения» для монтирования привязок? Что вызывает паузу во время зонда системного устройства? Поделитесь подключением wlan к ethernet с помощью командной строки Asible, пытаясь найти способ заставить тайм-аут задачи на хосте, на котором он сейчас работает VLC застрял в неправильной версии на Linux mint 17 (Qiana) Linux, как изменить состояние жесткого диска из ReadOnly после временного сбоя?

Отфильтровать 2-й вхождение текста между цитатами с помощью sed?

У меня есть grep-вывод файла, например, так:

"name" "Andrew Spokes" 

Я хочу извлечь имя, передавая вывод grep через sed .

Мой ожидаемый результат будет: Andrew Spokes

Мне также нужно удалить все пробелы, которые не находятся между кавычками.

Одним из способов будет:

 ... |sed -r 's/^"[^"]*" *"([^"]*)"$/\1/' Andrew Spokes 

другой с:

 sed -r 's/(([^"]*"){3})//; s/"//' 

или же:

 sed -r 's/.*"(.*)"$/\1/' 

Это [^"] соответствует любому отдельному символу, который не является " .

Следующее выражение работает для GNU sed:

 sed -E 's/^"name"[[:space:]]*"([^"]+)"$/\1/' 

Это работает путем создания регулярного выражения, которое соответствует всей строке, а также соответствия подвыражению, в котором найдена нужная часть имени. Это раздел в скобках, представляющий собой последовательность символов, которые не являются двойными кавычками. Все сопоставленное регулярное выражение заменяется подвыражением, обозначаемым как \1 в конце выражения.

Как пример того, как это работает:

 $ # Generate lines in the expected format $ echo $'"name" "Andrew Spokes"\n"name" "ABC"\n"name" "Foo Bar Baz"' "name" "Andrew Spokes" "name" "ABC" "name" "Foo Bar Baz" $ # Pipe the same lines to the sed command $ echo $'"name" "Andrew Spokes"\n"name" "ABC"\n"name" "Foo Bar Baz"' | sed -E 's/^"name"[[:space:]]*"([^"]+)"$/\1/' Andrew Spokes ABC Foo Bar Baz 

Если ваш опыт работы с регулярными выражениями GNU ограничен, это может помочь найти конструкции, используемые в приведенном выше регулярном выражении, в руководстве по GNU sed . Если использовать другой вкус sed, детали могут немного отличаться. Одним из вызовов является параметр -E , который включает «расширенные» регулярные выражения. В GNU sed это имеет специальные символы, такие как parens и обратные слеши, которые принимают значение создания подвыражений и обратных ссылок без их экранирования. Другое – использование ^ и $ чтобы требовать, чтобы полное регулярное выражение совпадало в начале и в конце строки.

Другой вызов – просто то, что используемое выражение sed делает предположения о том, насколько однородны все входные строки. Корректировки будут необходимы, если на входе больше вариаций.