Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl (Bash)使用文件中的命令输出计算令牌之间的文本_Perl_Bash_Sed_Awk - Fatal编程技术网

Perl (Bash)使用文件中的命令输出计算令牌之间的文本

Perl (Bash)使用文件中的命令输出计算令牌之间的文本,perl,bash,sed,awk,Perl,Bash,Sed,Awk,例如,我有文本文件 文本文本文本文本 文本*文本 我需要对里面的文本进行求值,并用这个求值的结果替换它(包括这些带有result that的标记) 如何使用akw、sed或perl实现这一点 我尝试过使用sed,但没有成功: sed“s/$(eval\1)/g” -bash:1:未找到命令 更新: 另外两项要求 1) 可能在同一行中有多个要替换的命令: text*text text 2) 任何函数都可以放在标记内,例如,我们有包含以下内容的Any.sh文件: #/bin/bash 函数任意_函数

例如,我有文本文件

文本文本文本文本

文本*文本

我需要对里面的文本进行求值,并用这个求值的结果替换它(包括这些带有result that的标记)

如何使用akw、sed或perl实现这一点

我尝试过使用sed,但没有成功:

sed“s/$(eval\1)/g”

-bash:1:未找到命令

更新:

另外两项要求

1) 可能在同一行中有多个要替换的命令:

text*text text

2) 任何函数都可以放在标记内,例如,我们有包含以下内容的Any.sh文件:

#/bin/bash
函数任意_函数
{
回声1美元
}

以及要处理的行:

文本*文本


你可以试一试:

perl -pi -e 's/<%(.*?)%>/$_=`$1`;chomp;$_;/ge' test.txt

作为我的结果。

不要相信这是一个单一的
sed
命令可以实现的。您可以将命令的结果存储在变量中,然后再将其分回到:

读行时
;做
结果=$(回显“$line”| sed-r的~.*.*.\1~'| bash)
回显“$line”| sed-r“s~~$result~”
完成
这对命令本身有些敏感-例如,如果命令包含换行符,则第二个
sed
命令将不喜欢它,因为变量在命令实际运行之前展开

输入文件:

text text <%head -1 /home/ooh/tmp/script%> text text
text * text <%echo "$(date +%Y/%m/%d)"%> text text

您可以计算一个值并在一行中动态地重新输入sed的结果。预定义eval是可能的,但我认为不能从内部组替换中进行。sed
命令上的错误是因为使用了双引号而不是单引号。这种差异在许多语言中都很重要,包括Unix shell。我知道。但是如果我使用单引号,命令eval将根本不会被计算你的正则表达式是贪婪的,一行中的多个
将不起作用。是的,这是一件不起作用的事情。还有一个。请在问题描述中查找更新。它在某些情况下不起作用。我更新了描述-请查找我添加的两个新需求。
text text Mon Mar 24 09:12:13 EDT 2014 text text
text * text Mon Mar 24 09:12:13 EDT 2014 text text
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