Как извлечь несколько шаблонов между токенами одновременно с помощью sed? - PullRequest
0 голосов
/ 23 мая 2018

Давайте предположим, что у меня есть файл с именем inputFile, который выглядит так:

blahblah token substring token something else token substring2 token

Весь файл содержит только 1 длинную строку.

Я хочу извлечь подстроки между токенами с помощью sed (substring, substring2).

На данный момент у меня есть:

[sed "s/^.* \?token\(.* \)token.* \?/\1/"][1] inputFile > outputFile

Я пытаюсь сделать это на основе этих вопросов, но, к сожалению, он возвращает только последнюю подстроку

Извлечение строк между 2 токенами в текстовом файле с использованием bash

Как заменить несколько шаблонов одновременно на sed?

Как выбрать строкимежду двумя шаблонами?

Ответы с объяснением будут отличными.

ОБНОВЛЕНИЕ реальный код ввода:

<archive><message id="0"><receiver>apr</receiver><sender>gtr</sender><text>52333</text><sendTime>554</sendTime><deliveryTime>765</deliveryTime></message><message id="0"><receiver>apr</receiver><sender>gtr</sender><text>4332</text><sendTime>764</sendTime><deliveryTime>922</deliveryTime></message></archive>

Ожидаемый результат:

apr gtr 52333
apr gtr 4332

1 Ответ

0 голосов
/ 23 мая 2018

Проблема в том, что sed является жадным, поэтому приведенная выше команда вернет substring2, только если вы добавите глобальный флаг (g):

Вы можете использовать awk для этого, где выпереопределите разделитель поля FS, чтобы он стал строкой token.Таким образом, ваши строки располагаются на четных позициях поля:

$ echo "blahblah token substring token something else token substring2 token"  | \
  awk -F 'token' '{for(i=2;i<=NF;i+=2) {print $i}}'
 substring 
 substring2

update:

Если вы вводите xml-файл, вы можете захотеть сделать:

<archive>
   <message id="0">
       <receiver>apr</receiver>
       <sender>gtr</sender>
       <text>52333</text>
       <sendTime>554</sendTime>
       <deliveryTime>765</deliveryTime>
   </message>
   <message id="0">
       <receiver>apr</receiver>
       <sender>gtr</sender>
       <text>4332</text>
       <sendTime>764</sendTime>
       <deliveryTime>922</deliveryTime>
   </message>
 </archive>" 

, ведущий к cmd:

xmlstarlet sel -t -m '//message' -v receiver -o " " -v sender -o " " -v text -n <file>

, который выводит

apr gtr 52333
apr gtr 4332
...