使用正则表达式模式匹配的shell脚本

时间:2013-01-07 06:11:45

标签: regex shell awk

我有一个文件说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'命令,但我得到了所需的输出,因为订单没有保留。我需要获取保存订单的输出。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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