简体   繁体   中英

sed reverse order label reading

I would like to use sed to parse a file and prints only the last i labels within a field. Each label is separate by a . .

If I select i=3 , with a file that contains the following lines:

begin_text|label_n.label_n-1.other_labels.label3.label2.label1|end_text
BEGIN_TEXT|LABEL3.LABEL2.LABEL1|END_TEXT
Begin_Text|Label2.Label1|End_Text

I would like, if there are at least 3 labels, the output lines to be:

begin_text|label_n.label_n-1.other_labels.label3.label2.label1|end_text
BEGIN_TEXT|LABEL3.LABEL2.LABEL1|END_TEXT

Currently :

sed 's;\(^[^|]\+\)|.*\.\([^\.]\+\.[^\.]\+\.[^\.]\+\)|\([^|]\+$\);\1|\2|\3;' test.txt

produces:

begin_text|label3.label2.label1|end_text
BEGIN_TEXT|LABEL3.LABEL2.LABEL1|END_TEXT
Begin_Text|Label2.Label1|End_Text

and I do not get why a matching occurs for line 3. I also suppose ther eis a better way to do reverse order label reading.

Any comment/suggestion is appreciated.

Using awk will make the job easier.

awk 'split($2,a,".")>=i' FS="|" i=3 file

begin_text|label_n.label_n-1.other_labels.label3.label2.label1|end_text
BEGIN_TEXT|LABEL3.LABEL2.LABEL1|END_TEXT

Explanation

split(string, array, fieldsep)
split returns the number of elements created. 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM