[英]shell scripting using regular expression pattern matching
我有一個文件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'命令,但是由於沒有保留順序,所以我得到了期望的輸出。 我需要獲取保留訂單的輸出。
這是使用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
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.