我有一个类似以下格式的文件:
line one
line two <% word1 %> text <% word2 %>
line three <%word3%>
我想使用 awk、sed 等 linux shell 工具来获取 <% %>
结果中引用的所有单词
word1
word2
word3
感谢帮助。
我忘了提:我在嵌入式环境中。grep 没有 -P 选项
使用 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
你可以用 grep 来做:
$ grep -oP '(?<=<%).+?(?=%>)' file
word1
word2
word3
这适用于您的示例:
sed -ne 's/%>/&\n/p' | sed -ne 's/.*<%\s*\(.*\)\s*%>.*/\1/p' < sample.txt
第一个sed
只是在每次关闭后换行%>
,作为准备。
接下来在没有前导和尾随空格的情况下sed
提取相关部分。<% ... %>
在这两个命令中,-n
与 are 结合的标志s///p
将通过管道的数据限制为仅匹配(相关)行。
使用 awk:
awk -F '<% *| *%>' '{for(i=2; i<=NF; i+=2) print $i}' file
word1
word2
word3
这可能对您有用(GNU sed):
sed '/<%\s*/!d;s//\n/;s/[^\n]*\n//;s/\s*%>/\n/;P;D' file