сокращение для пар ключ-значение

Я ищу простой способ вырезать пары ключ-значение (где ключ уникален и указан) из текста, подобно тому, как cut можно использовать для вырезания указанного столбца в файле CSV. Ключи, которые я ищу, не всегда находятся в одном и том же относительном положении в строке, т. Е. Использование cut за которым следует sed , не будет делать трюк, потому что ключ, который я ищу, не всегда в том же , -пределенная колонка.

Текст, о котором идет речь, действительно CSV, но так бывает, что значения являются парами ключ / значение, разделенными на = .

Например, я могу проанализировать файл со следующими тремя строками:

 Foo=1, Bar=2, Baz=3 Bar=4, Foo=2, Baz=3 Bar=42, Baz=42, Foo=3 

И я хотел бы отрезать этот текст, чтобы получить пару ключ / значение для определенного ключа. Если бы я искал Foo , тогда мой желаемый результат был бы:

 Foo=1 Foo=2 Foo=3 

В идеале я хотел бы использовать инструмент командной строки, который имеет похожий синтаксис как cut , и может читать как из stdin, так и из файла.

Есть ли такой инструмент?

5 Solutions collect form web for “сокращение для пар ключ-значение”

grep может сделать это с опцией -o :

 grep -o 'Foo=[^,]*' file 

Решение awk для округления списка альтернатив:

 awk -v RS=', ' -F'=' '$1=="Foo"' <file> 

Рассматривайте каждую запись, которая должна быть разделена символом ', ' , и разбивайте каждую запись на поля символа = (с использованием -F ). Тогда это просто вопрос соответствия в первом поле $1 . Предложенное здесь предложение представляет собой простое совпадение строк, не стесняйтесь использовать регулярные выражения, например $1~/\<Foo\>/ .

В зависимости от сложности вашей реальной ситуации эта команда sed может быть достаточной:

 sed -n 's/^.*\(\<Foo=[^,]*\).*/\1/p' 

Вот пример работы

 FIELD='Foo' sed -n "s/^.*\(\<${FIELD}=[^,]*\).*/\1/p' << xxEOFxx Foo=1, Bar=2, Baz=3 Bar=4, Foo=2, Baz=3 Bar=42, Baz=42, Foo=3 xxEOFxx Foo=1 Foo=2 Foo=3 

Учитывая ваш пример, хрупкое решение может включать cut :

 tr ', ' '[\n*]' <input | cut -sd F -f1- 

… который поместил бы каждую пару ключ / значение в отдельную строку путем tr форматирования промежуточных запятых и пробелов в \n ewlines, а затем cut бы линии, не содержащие F Но это высокоспециализированный пример и может работать только в том случае, если вы можете быть уверены, что F происходит только в желаемых парах ключ / значение.

В противном случае sed будет тем, что я буду использовать:

 sed 'y/ ,/\n\n/;/^Foo=/P;D' <input 

Который также tr ансформирует промежуточные запятые и пробелы в \n ewlines, но тогда только P rint те пары ключ / значение, которые начинаются с строки Foo= . До тех пор, пока пробелы являются надежными разделителями, вышеупомянутое будет работать, чтобы переносить пары ключей / значений Foo каждый на отдельной строке независимо от того, сколько раз они могут возникать на входной строке, и ничего не печатало бы – даже для строк, которые не содержат ключ / значения, которые вы хотите напечатать.

Если у вас нет grep доступного с опцией -o , это также должно сделать трюк:

 sed -e 's/, /\n/g' | grep '^Foo=' 

Это использование sed чтобы заменить каждое запятое + пространство на новую строку (разбивая каждую пару «ключ-значение» на свою собственную строку), а затем grep, чтобы искать только «Foo».

Прецедент:

 printf "%s\n" "Foo=1, Bar=2, Baz=3" "Bar=4, Foo=2, Baz=3" "Bar=42, Baz=42, Foo=3" \ | sed -e 's/, /\n/g' | grep '^Foo=' 
  • Проблема с добавлением колонки с awk
  • Искать каталоги для многострочной строки
  • Сценарий оболочки: как я могу писать многострочный контент в файл, если файл не существует?
  • Есть ли заклинание командной строки для сохранения определенных столбцов по имени в CSV-файле?
  • grep все строки в файле и запись строки в файл из точки соответствия шаблона
  • Я хочу, чтобы grep из текстовой строки из многих файлов, как я могу запустить цикл для этого
  • Суммируйте значения в столбце, кроме заголовка
  • Временное отображение текста в терминале, возможно небольшая разметка (полужирный, цвета). AKA "играть .srt субтитры"
  • Заменить образ в PDF с помощью командной строки
  • Как установить csplit для вывода имен файлов по шаблону?
  • Получение списка пользователей с помощью grepping / etc / passwd
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.