Как я могу извлечь конкретную строку в Linux? [закрыто]

Я новичок в Bash, и у меня возникли трудности с тем, как получить конкретную строку в моем файле ниже:

  DS*SC*S45WG*X56558*2
  NE*823*2*SC*q345w45*DT*RTD*7530SRT
  RJTROIT**20140617
  SNA**TP*55
  DS*SC*S45WG*X56558*2
  NE*17*2*SC*211*DT*DFS*75304KSRTRSHT**20140617
  RSS**TP*55
  DS*SC*S45WG*X56558*2
  NE*18*1*SC*3435*DT*PR*753SLRT
  JSRT**20140617~RSS**TP*55
  DS*SC*S45WG*X56558*1
  NE*19*1*SC*ERS*DT*DFS*753048SRY
  TSERY4654**20140617~RSS**TP*60
  DS*SC*S45WG*X56558*1
  NE*19*1*SC*FRAE*DT*ESS*753048499RYTSR**20140722
  RSS**TP*140
  DS*SC*S45WG*X56558*1
  NE*73*46464
  SD**15769
  SNA*PUI*000015769

С помощью этого файла, который я указал выше, я хочу получить все следующие данные / значения:

7530SRTRJTROIT
75304KSRTRSHT
753SLRTJSRT
753048SRYTSERY4654
753048499RYTSR

(например, рядом с NE * 823 * 2 * SC * q345w45 * DT * RTD). Спасибо!

1
задан 16 March 2015 в 11:55

2 ответа

Поскольку значения, которыми Вы интересуетесь, кажется, разделяются на нескольких строках, я полагался бы на чистый жемчуг regexp для соответствия правильным шаблонам:

cat file.txt | perl -e 's/\s//g && print "$_\n" for join("", <>) =~ /\*([\w\s]+)[~]{0,1}\w{3}\*\*TP/gm'

Примечание: Я сделал предположение, что значения Вы ищете концы с этим разделителем:

XXX**TP где XXX мог быть RSS или SNA в Вашем примере.

Как это работает

  • join("", <>) создает единственную строку из результата cat команда
  • то, что я использую для синтаксического анализа ( =~ оператор) использующий это регулярное выражение:

    /\*([\w\s]+)[~]{0,1}\w{3}\*\*TP/gm

    Этот regexp ищет строки, начинающиеся со звезды \* и сделанный из [A-Za-z0-9 _] символы (ярлык \w для слов) и пробелы \s, возможное ~ (в 0 или 1 раз) и затем 3 словесных символа (например: RSS или SNA) две звезды \*\* сопровождаемый TP.

    Круглая скобка используется для получения только шаблона, включенного между ними.

    /gm regexp модификаторы где g возвратит все строки соответствий (не только первая) и m позволяет многострочные поиски.

  • for циклы оператора по всем результатам и призыву к каждому соответствию найдены s/\s//g && print "$_\n".

    s/\s//g удаляет все пробелы (включая возвраты каретки) и print "$_\n" произведите конечный результат ($_ будучи текущим значением в для цикла)

Это дает мне математические ожидания (без жесткого кодирования их в команде):

7530SRTRJTROIT
75304KSRTRSHT
753SLRTJSRT
753048SRYTSERY4654
753048499RYTSR

Обновление: (для включения шаблона даты)

Используйте следующую команду теперь:

cat file.txt | perl -e 'for$a(join("", <>)=~/\*([A-Z0-9\s]+?)\*\*\d{8}/g){$a=~s/\s+//g;print"$a\n"}'
1
ответ дан 16 March 2015 в 11:55

Можно использовать cat для отображения файла и grep для получения только строк с vaues, который Вы хотите.

, например: cat myfile | grep 7530SRTRJTROIT

или получить несколько vaues можно использовать egrep, который позволяет регулярные выражения:
egrep "7530SRTRJTROIT|75304KSRTRSHT|753SLRTJSRT|753048SRYTSERY4654|753048499RYTSR" myfile

0
ответ дан 16 March 2015 в 11:55

Другие вопросы по тегам:

Похожие вопросы: