Я новичок в 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). Спасибо!
Поскольку значения, которыми Вы интересуетесь, кажется, разделяются на нескольких строках, я полагался бы на чистый жемчуг 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"}'
Можно использовать cat
для отображения файла и grep
для получения только строк с vaues, который Вы хотите.
, например: cat myfile | grep 7530SRTRJTROIT
или получить несколько vaues можно использовать egrep
, который позволяет регулярные выражения:
egrep "7530SRTRJTROIT|75304KSRTRSHT|753SLRTJSRT|753048SRYTSERY4654|753048499RYTSR" myfile