2013-02-26 50 views
1

我嘗試使用sed/awk命令來解析我的文本文件。 我想在兩個模式之間打印文本,並在其中添加一些字符。 例如: 如果我行SED:在同一行中的兩個模式之間合併文本

uint8_t aucRepresentationName[NR_UNIT_REPRESENTATIONS][CHARS_P_REPRESENTATION];

OR

uint8_t aucRepresentationName [NR_UNIT_REPRESENTATIONS] [CHARS_P_REPRESENTATION]; 

我想打印NR_UNIT_REPRESENTATIONS*CHARS_P_REPRESENTATION

所以,我曾與sed命令盯着'['後插入線deliminter \n,在合適的物種中劃分線,然後嘗試再次解析。

echo "bla bla bla [AK] bla bla bla bla [A_K] bla bla bla" | sed 's/\[/\n&/g;' | awk '{sub(/.*\[ /,"");sub(/\].*/,"");print;}' 

echo "bla bla bla [AK] bla bla bla bla [A_K] bla bla bla" | sed 's/\[/\n&/g;' | sed -e 's/^.*\[ //g;s/ \].*$//g' 

它是不是總有兩個diamensional陣列,也可能是沒有或單/雙維數組,我需要的[]第多少實例,如果它的0然後寫1,如果單diamensional陣列然後ex A [SIZE]然後寫SIZE其兩維陣列例如:A [RAW] [COL]寫入RAW * COL ..

我想知道我的命令有什麼問題?或任何其他選項來做到這一點,因爲它會幫助我進一步學習sed。

Amruta

+0

沒有名爲SED/AWK工具。 sed是簡單替換單行的優秀工具。對於所有其他的文本操作,你應該使用awk。你不需要學習sed - 你可以從幾個例子中拿出你需要知道的一切。通過閱讀「有效的Awk編程,第三版」一書開始學習awk。 – 2013-02-26 13:15:22

+0

代碼中的無維數組是什麼樣的?它是一個大小爲[]的數組,還是它是一個標量變量或別的東西?發佈一些更具代表性的示例輸入,其中包括您想要解析的所有陣列聲明的類型以及給定該輸入的預期輸出。 – 2013-02-26 13:21:37

+0

我的文本文件包含標量變量和一些數組。說U8 A,U16 B [5],U16 B [4] [2],U32 C [2] [3] [4] ..等等。我需要解析此文件並將結果存儲在文件中U8 1 U16 5 U16 4 * 2 U32 2 * 3 * 4 – Amruta 2013-02-27 06:32:53

回答

1

嘗試:

awk -F '[][]' '{print $2,$4}' OFS=\* file 

OK,如果是0,1或單一出現的二維在一個頁面上,你可以嘗試:

awk -F '[][]' '{if(NF==3)print $2; else if(NF>4)print $2,$4; else print 1}' OFS=\* file 

或更少理解):

awk -F '[][]' '{$0=NF==3?$2:NF>4?$2 OFS $4:1}1' OFS=\* file 
+0

但它並不總是二維數組,它可能是無或單/二維數組,我需要先有多少個實例[],如果它的0那麼寫1,如果它的單維數組那麼EX [SIZE ]然後寫SIZE它的兩個數組ex:A [RAW] [COL]寫入RAW * COL .. – Amruta 2013-02-26 08:40:46

+0

嗨,我正在嘗試使用上面提到的命令。命令是echo $ Readline | awk -F'[] []''{$ 0 = NF == 3?$ 2:NF> 4?$ 2 OFS $ 4:1} 1'OFS = \ *其中readline包含從文本文件讀取的行。令人驚訝的是它在提示符下工作,但不是當我從.sh文件執行它時。它總是打印「1」我找不到理由 – Amruta 2013-02-27 06:39:23

+0

很難說爲什麼會有差異。你能否提供一個示例輸入文件和腳本詳細信息並提供詳細信息,如操作系統,外殼和版本? – Scrutinizer 2013-02-27 10:30:19

1

使用這樣的:

perl -lne 'push @a,/\[([^\]]*)\]/g;END{print join "*",@a}' 

here 改性下面試驗:

> echo "bla [AK] bla [A_K] 10" | perl -lne 'push @a,/\[([^\]]*)\]/g;END{print join "*",@a}' 
AK*A_K 
0

隨着SED:

sed -n 's/[^]]*\[\([^]]*\)\]\s*\[\([^]]*\)\].*$/\1*\2/p' input 
1

你可以嘗試以下方法:

echo "bla bla bla [AK] bla bla bla bla [A_K] bla bla bla" | sed 's/.*\[\(.*\)\].*\[\(.*\)\].*/\1*\2/g' 

AK * A_K

+0

但它並不總是二維數組,它可能是none或單/雙維數組,我需要先有多少個實例[],如果它的0那麼寫1,如果它的單維數組那麼ex A [SIZE ]然後寫入SIZE其兩維數組ex:A [RAW] [COL]寫入RAW * COL .. – Amruta 2013-02-26 08:17:39

相關問題