(Bash)使用文件中的命令输出评估标记之间的文本

时间:2014-03-24 12:31:09

标签: perl bash sed awk

我有文本文件,例如

  

文本文字<%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;文字文字

2 个答案:

答案 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