2013-08-24 35 views
1

我有一個如下格式的文件得到的所有比賽%>
結果應該是像Linux shell中,從文件

word1 
word2 
word3 

感謝您的幫助。

我忘了提及:我在嵌入式環境。 grep的沒有-P選項

回答

2

用awk:

awk -F '<% *| *%>' '{for(i=2; i<=NF; i+=2) print $i}' file 
word1 
word2 
word3 
2

你可以使用grep做到這一點:

$ grep -oP '(?<=<%).+?(?=%>)' file 
word1 
word2 
word3 
+0

謝謝!忘記提及,我在嵌入式環境中。 grep沒有-P選項 – alzhao

2

這適用於您的樣品:

sed -ne 's/%>/&\n/p' | sed -ne 's/.*<%\s*\(.*\)\s*%>.*/\1/p' < sample.txt 

第一sed只是把後,每關%>一個換行符,作爲準備。

下一個sed提取了<% ... %>中的相關部分,沒有前導和尾隨空格。

在這兩種命令,則-n標誌與s///p組合是限制數據通過管道將要匹配的(相關)僅行。

+0

謝謝。這工作完美。 – alzhao

+0

請注意上面有兩個不可移植的sed構造:a)使用'\ n'作爲換行符(反斜槓後跟一個文字回車符是可移植的)和b)使用's代表一個空格字符('[[:blank:]]'是POSIX,但在這種情況下,空白字符可能就足夠了)。當你的grep不支持'-P'時,我很驚訝你的sed和那些工程師一起工作。 –

4

隨着GNU awk的,所以我們可以RS到多個字符:

$ gawk -v RS='<% *| *%>' '!(NR%2)' file 
word1 
word2 
word3 

與任何現代AWK:

$ awk -F'<% *| *%>' '{for (i=2;i<=NF;i+=2) print $i}' file 
word1 
word2 
word3 
+1

這很漂亮! – janos

+1

這太好了! – alzhao

0

這可能會爲你工作( GNU sed):

sed '/<%\s*/!d;s//\n/;s/[^\n]*\n//;s/\s*%>/\n/;P;D' file