Извлечь только часть данных из файла - PullRequest
1 голос
/ 15 марта 2019

Мой ввод - test.txt, который содержит данные в следующем формате:

'X'=>'ABCDEF',
'X'=>'XYZ',
'X'=>'GHIJKLMN',

Я хочу получить что-то вроде:

'ABCDEF',
'XYZ',
'GHIJKLMN',

Как мне поступить в bash?

Спасибо!

Ответы [ 4 ]

1 голос
/ 15 марта 2019

Если на входе никогда не содержится символа > где-либо еще, кроме "жирной стрелки", вы можете использовать cut:

cut -f2 -d\> file
  • -d указывает разделитель, здесь > (обратная косая черта необходима для предотвращения интерпретации оболочкой его как оператора перенаправления)
  • -f указывает, какое поле извлечь
1 голос
/ 15 марта 2019

Вот решение с использованием sed:

curl -sL https://git.io/fjeX4 | sed 's/^.*>//' 

Sed передается единственная команда: s ///. является регулярным выражением, которое соответствует любым символам (. *) от начала строки (^) до последнего '>'. Это пустая строка, так что по сути sed просто удаляет все символы в строке до последнего>. Как и в других решениях, это решение предполагает, что в строке есть только один «>».

0 голосов
/ 15 марта 2019

Использование awk

awk 'BEGIN{FS="=>"}{print $2}' file
'ABCDEF',
'XYZ',
'GHIJKLMN',

FS в awk означает разделитель полей.Код внутри BEGIN выполняется только в начале, т. Е. До обработки первой записи.$2 печатает второе поле.

Более идиоматичным способом размещения вышеприведенного материала будет

awk 'BEGIN{FS="=>"}$2' file
'ABCDEF',
'XYZ',
'GHIJKLMN',

Действие по умолчанию в awk - печать записи.Здесь мы прямо упоминаем, что печатать.т.е. $2.

0 голосов
/ 15 марта 2019

Если данные действительно единообразны, то вы можете просто запустить cut (на пример ввода ):

$ curl -sL https://git.io/fjeX4 | cut -d '>' -f 2
'ABCDEF',
'XYZ',
'GHIJKLMN',

Вы можете увидеть пояснения к флажку на объяснительная оболочка .

С awk это будет выглядеть примерно так:

$ curl -sL https://git.io/fjeX4 | awk -F '>' '{ print $2 }'
'ABCDEF',
'XYZ',
'GHIJKLMN',
...