Извлечение нескольких данных из столбца с помощью sed

У меня есть файл с такой информацией

Info A: 1 Info B: 2 Info C: 3 Info D: 4 Info A: 1 Info B: 2 Info C: 123 Info D: 4 

Теперь я пытаюсь получить строку с помощью Info C, но мне нужно ее отдельно. Мне нужна команда для получения вывода Info C первого блока и команды для получения Info C из второго блока. Эта команда работает для меня, чтобы получить информацию C обоих блоков. В первой части команды я удаляю все вещи, кроме строк с информацией C. Во второй части команды я удаляю строку «Info C:»,

 cat test2 | sed -e '/Info C: /!d' -e 's/Info C: //' 

Вывод содержит только значение:

 3 123 

Теперь, чтобы получить его отдельно, я попробовал несколько аргументов для sed, но ничего не работает для меня.

Следующее решение отлично подходит для меня. Я просто печатаю первую или последнюю строку

 cat test2 | sed -e '/Info C: /!d' -e 's/Info C: //' | sed -n '$p' cat test2 | sed -e '/Info C: /!d' -e 's/Info C: //' | sed -n '1p' 

Но мне интересно, если есть решение без второго конвейера для sed?

Ну, если ваша оболочка поддерживает массивы, вы можете сделать:

 $ infoC=( $(sed -n 's/Info C: \(.*\)/\1/p' file ) ) $ echo ${infoC[0]} 3 $ echo ${infoC[1]} 123 

Или, с GNU sed :

 infoC=($(sed -rn 's/Info C: (.*)/\1/p' file )) 

Здесь я использую более простую команду sed . -n подавляет нормальный выход, поэтому он печатает только строки, о которых вы говорите. Оператор замещения соответствует строкам с Info C: и фиксирует (с круглыми скобками) значение, которое сохраняется как \1 . Таким образом, он заменит строку на \1 и напечатает ее ( p в конце).

Команда var=( $(command) ) является способом сохранения вывода command в массиве var . Первый элемент – это ${var[0]} , второй ${var[1]} и т. Д. Здесь имя массива – infoC .

 cat test2 | sed -e '/Info C: /!d' -e 's/Info C: //' | sed -n '1p;$p'