Reputation: 91
I have YAML file as input. In input file, I have sales and sales($) rows. I need to take only one row as output.
Logic:
Can anyone guide how to achieve this perl 5?
My Input File Looks like...
---
Order ID: W00875205405667
Sales($): '7.5'
Transaction Datetime: 2015-03-29 16:17:00
---
Order ID: W00875205405668
Sales: '74.50'
Sales($): '72.5'
Transaction Datetime: 2015-03-29 16:17:00
---
Order ID: W00875205405669
Sales: '12.50'
Transaction Datetime: 2015-03-29 16:17:00
---
Need Output File as:
---
Order ID: W00875205405667
Sales: '7.5'
Transaction Datetime: 2015-03-29 16:17:00
---
Order ID: W00875205405668
Sales: '72.50'
Transaction Datetime: 2015-03-29 16:17:00
---
Order ID: W00875205405669
Sales: '12.50'
Transaction Datetime: 2015-03-29 16:17:00
---
Upvotes: 0
Views: 68
Reputation:
You could preference the sales($) and use just a single capture buffer
with a Branch Reset construct (?|,,)
# /(?m)^Order\h+ID:\h*(.*)\s+(?|(?:^.*\s+)?^Sales\(\$\):\h*(.*)\s+|^Sales:\h*(.*)\s+)^Transaction\h+Datetime:\h*(.*)/
(?m)
^ Order \h+ ID: \h*
( .* ) # (1)
\s+
(?|
(?: ^ .* \s+ )?
^ Sales\(\$\): \h*
( .* ) # (2)
\s+
|
^ Sales: \h*
( .* ) # (2)
\s+
)
^ Transaction \h+ Datetime: \h*
( .* ) # (3)
Output:
** Grp 0 - ( pos 0 , len 85 )
Order ID: W00875205405667
Sales($): '7.5'
Transaction Datetime: 2015-03-29 16:17:00
** Grp 1 - ( pos 10 , len 15 )
W00875205405667
** Grp 2 - ( pos 37 , len 5 )
'7.5'
** Grp 3 - ( pos 66 , len 19 )
2015-03-29 16:17:00
-------------------
** Grp 0 - ( pos 92 , len 102 )
Order ID: W00875205405668
Sales: '74.50'
Sales($): '72.5'
Transaction Datetime: 2015-03-29 16:17:00
** Grp 1 - ( pos 102 , len 15 )
W00875205405668
** Grp 2 - ( pos 145 , len 6 )
'72.5'
** Grp 3 - ( pos 175 , len 19 )
2015-03-29 16:17:00
-------------------
** Grp 0 - ( pos 201 , len 84 )
Order ID: W00875205405669
Sales: '12.50'
Transaction Datetime: 2015-03-29 16:17:00
** Grp 1 - ( pos 211 , len 15 )
W00875205405669
** Grp 2 - ( pos 235 , len 7 )
'12.50'
** Grp 3 - ( pos 266 , len 19 )
2015-03-29 16:17:00
Upvotes: 1