我正在编写一个脚本,该脚本使用 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
显然,您必须在特定执行的上下文中准备此内容。
通过您的问题的更多详细信息,可能可以进一步采用此解决方案,但我相信您在这里有足够的信息来针对您的特定用例重新设计它。