簡體   English   中英

使用正則表達式模式匹配的Shell腳本

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM