2013-01-07 79 views
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> 

我neen順序相同的形式的輸出。即,我需要從轉換映射和類型和名稱字段獲得名稱字段「在同一順序:

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的」命令太多,但我得到期望的輸出,因爲不保留的順序,我需要在獲得輸出,其中的順序。

回答

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 
+0

Hello Sarathi, 謝謝您的回覆。我會嘗試你的解決方案。我對perl的知識非常少。但我能夠理解這個命令。而且我也不需要<映射>中的「數字」字段。我只需要「名稱」字段。問題是沒有。對於每個<映射...的屬性(數字,名稱等)是不同的。 – Karthik

+0

根據您的需要更新了答案。 – Vijay

+0

謝謝Sarathi。那會做:) – Karthik

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

你好史蒂夫, 謝謝你的回覆。我會考慮你的解決方案,並嘗試一下,並會更新你的相同。 – Karthik