sed逆序标签阅读

时间:2014-04-30 10:08:58

标签: regex bash sed

我想使用sed来解析文件并仅打印字段中的最后i个标签。每个标签由.分隔。

如果我选择i=3,文件包含以下行:

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

我想,如果至少有3个标签,则输出行为:

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

目前:

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

产生

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

我不明白为什么第3行会发生匹配。我也认为这是一种更好的方法来进行逆序标签阅读。

任何意见/建议都表示赞赏。

1 个答案:

答案 0 :(得分:2)

使用awk可以使工作更轻松。

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

解释

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