1

我有一个文件说 abc.txt 其中包含..

<mapping number=1 name=m1> 
<transformation type=aggregator name=agg_m1> /> 
<transformation type=joiner name=j_m1 /> 
</mapping>

<mapping number=2 name=m2> 
<transformation type=router name=rtr_m2> /> 
<transformation type=joiner name=j_m2 /> 
</mapping>

我需要一个相同订单形式的输出。即,我需要以相同的顺序从映射中获取名称字段,并从转换中获取类型和名称字段:

name=m1
type=aggregator name=agg_m1
type=joiner name=j_m1
name=m2
type=router name=rtr_m2
type=joiner name=j_m2

我已经使用命令 'awk' 来获取输出,但我得到的输出格式如下,这是不正确的:

name=m1
name=m2
type=aggregator name=agg_m1
type=joiner name=j_m1
type=router name=rtr_m2
type=joiner name=j_m2

我也尝试使用“grep”和“sed”命令,但我得到了所需的输出,因为没有保留顺序。我需要获取保留订单的输出。

4

2 回答 2

0

这是一种使用方法grep

grep -oE "(name|type)=[^ >]* *[^ >]*" file

结果:

name=m1
type=aggregator name=agg_m1
type=joiner name=j_m1
name=m2
type=router name=rtr_m2
type=joiner name=j_m2
于 2013-01-07T06:45:39.030 回答
0
 perl -lne '$_=~m/^[^\s]*\s([^\/\>]*)/g;print $1' your_file

测试如下:

> cat temp
<mapping number=1 name=m1>
<transformation type=aggregator name=agg_m1> />
<transformation type=joiner name=j_m1 />
</mapping>

<mapping number=2 name=m2>
<transformation type=router name=rtr_m2> />
<transformation type=joiner name=j_m2 />
</mapping>
> perl -lne '$_=~m/^[^\s]*\s([^\/\>]*)/g;print $1' temp
number=1 name=m1
type=aggregator name=agg_m1
type=joiner name=j_m1


number=2 name=m2
type=router name=rtr_m2
type=joiner name=j_m2

>

如果您不需要number,请使用以下正则表达式:

perl -lne '$_=~m/^[^\s]*\s[number=\d]*([^\/\>]*)/g;print $1' your_file
于 2013-01-07T07:08:23.527 回答