1

我有一个类似以下格式的文件:

line one  
line two <% word1  %> text <% word2 %>  
line three <%word3%>  

我想使用 awk、sed 等 linux shell 工具来获取 <% %>
结果中引用的所有单词

word1  
word2  
word3  

感谢帮助。

我忘了提:我在嵌入式环境中。grep 没有 -P 选项

4

5 回答 5

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
于 2013-08-24T12:34:20.230 回答
2

你可以用 grep 来做:

$ grep -oP '(?<=<%).+?(?=%>)' file
 word1  
 word2 
word3
于 2013-08-24T10:14:37.637 回答
2

这适用于您的示例:

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

第一个sed只是在每次关闭后换行%>,作为准备。

接下来在没有前导和尾随空格的情况下sed提取相关部分。<% ... %>

在这两个命令中,-n与 are 结合的标志s///p将通过管道的数据限制为仅匹配(相关)行。

于 2013-08-24T11:30:44.627 回答
2

使用 awk:

awk -F '<% *| *%>' '{for(i=2; i<=NF; i+=2) print $i}' file
word1
word2
word3
于 2013-08-24T12:10:22.980 回答
0

这可能对您有用(GNU sed):

sed '/<%\s*/!d;s//\n/;s/[^\n]*\n//;s/\s*%>/\n/;P;D' file
于 2013-08-24T19:56:24.787 回答