我有文本文件,例如
文本文字<%any_command" $(another_command)"参数%>文字文字
text * text<%any_command" $(another_command)"参数%>文字文字
我需要评估< %%>内的文字。并用此评估结果替换它(包括这些具有结果的标记)。
如何使用akw或sed或perl完成此操作?
我试图使用sed但没有成功:
sed "s/<%\(.*\)%>/$(eval \1)/g"
-bash: 1: command not found
更新:
另外两项要求
1)可能是在同一行上要替换的几个命令:
text * text&lt;%any_command&#34; $(another_command)&#34;参数%&gt; text&lt;%any_command&#34; $(another_command)&#34;参数%&gt; text
2)任何功能都可以放在&lt; %%&gt;内。标签,例如我们有any.sh文件,其中包含以下内容:
#/bin/bash
function any_function
{
echo $1
}
和要处理的行:
text * text&lt;%any_function 1%&gt;文字文字
答案 0 :(得分:1)
你可以试一试:
perl -pi -e 's/<%(.*?)%>/$_=`$1`;chomp;$_;/ge' test.txt
将捕获与该模式匹配的行,shell out以在bash中运行命令,删除尾随换行符并用结果替换占位符。
当我使用以下示例文件运行时:
text text <% date %> text text
text * text <% date %> text text
我得到了:
text text Mon Mar 24 09:12:13 EDT 2014 text text
text * text Mon Mar 24 09:12:13 EDT 2014 text text
作为我的结果。
答案 1 :(得分:1)
不要相信这可以作为单个sed
命令。您可以将命令的结果存储在变量中,然后再将其存储在:
while read line; do
result=$(echo "$line" | sed -r 's~.*<%(.*)%>.*~\1~' | bash)
echo "$line" | sed -r "s~<%.*%>~$result~"
done < input.txt
这对命令本身有点敏感 - 例如,如果命令包含换行符,则第二个sed
命令不会喜欢它,因为变量在命令实际运行之前被扩展。
输入文件:
text text <%head -1 /home/ooh/tmp/script%> text text
text * text <%echo "$(date +%Y/%m/%d)"%> text text
输出:
text text while read line; do text text
text * text 2014/03/24 text text