( sed 命令)-> sed $foo

( sed 命令)-> sed $foo

我正在编写一个脚本,该脚本使用 sed 命令来替换文件中的特定标识符。目前该脚本已对 sed 命令进行硬编码

当前方法:

s*ed 's/@Number@/ '  "${Number}" '/g; s/@Value@/ ' "${Value}" '/g; 
        s/@Socket@/ ' "${Socket}" '/g' File_Template > index.html*

由于 sed 命令将不再被硬编码,并且我们正在运行许多具有不同 sed 要求的进程,我想做这样的事情

目标:

INITIALIZE_SED_COMMAND='s/@Number@/ ' "${Number}" '/g;
        s/@Value@/ ' "${Value}" '/g; 
        s/@Socket@/ ' "${Socket}" '/g;'
# Some logic happens here
INITIALIZE_SED_COMMAND="$INITIALIZE_SED_COMMAND File_Template > index.html"  ;

sed $INITIALIZE_SED_COMMAND

这可以作为脚本在 Linux 平台上运行,.sh但我需要在 .ksh unix我一直无法解析。

错误:

sed:无法找到或打开文件 s/@Number@/npdsfg/g;。

sed:无法找到或打开文件 s/@Value@/SQR。

sed:无法找到或打开文件#s/@Socket/semi_/g;。

答案1

这不是从基于 Linux 的系统迁移到某些非基于 Linux 的系统(AIX,也许?)的结果。这是对 shell 如何解析和执行命令的根本误解。

您不能编写此代码并期望它将时间戳写入文件:

v="date > /tmp/date.txt"
$v

同样,您不能编写此代码并让它执行替换并将结果写入输出文件

v="s/abc/XYZ/ /tmp/source > /tmp/destination"
sed $v

不能在变量内指定文件重定向。

我认为您正在寻找的是sed -f,您可以在其中创建替换文件并将它们应用于源数据文件:

#!/bin/ksh
# Usage: thisprogram  <transform_file>  <src_file>  <dst_file>
#
transform="$1"
src="$1"
dst="$2"

sed -f "$transform" "$src" >"$dst"

转换文件可能包含如下操作:

s/@Number@/1234/g
s/@Value@/somevalue/g
s/@Socket@/99b44/g

显然,您必须在特定执行的上下文中准备此内容。

通过您的问题的更多详细信息,可能可以进一步采用此解决方案,但我相信您在这里有足够的信息来针对您的特定用例重新设计它。

相关内容