【发布时间】:2016-06-29 14:47:03
【问题描述】:
我正在尝试使用 sed 替换外部文件中的 ${SRC} 和 ${MSG}。它们都是在以下 bash 脚本中可用的变量。
#!/bin/bash
SRC=$1
DST=$2
MSG=$3
CONN=$4
GROUP=$5
echo "$SRC","$DST","$MSG","$CONN","$GROUP" >> /home/maaz/smpp/smppin/incoming.log
/usr/bin/sed -i -e "s/\${SRC}/$SRC/" -e "s/\${MSG}/$MSG/" request.xml >> request.xml
文件 request.xml 如下所示:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
<soapenv:Header/>
<soapenv:Body>
<tem:SendSMS>
<!--Optional:-->
<tem:Number>${SRC}</tem:Number>
<!--Optional:-->
<tem:AccountID>${MSG}</tem:AccountID>
</tem:SendSMS>
</soapenv:Body>
</soapenv:Envelope>
我需要用 bash 中的相应值替换文本 ${SRC} 和 ${MSG}。目前相同的 sed 表达式正在替换文本,如果从外部 bash 运行,但调用脚本时文件没有变化。
我们将不胜感激。
【问题讨论】:
-
如果您使用
-i和sed,它会自动就地编辑文件。从同时也是输入的文件重定向输出通常会给您留下一个空文件。只需从末尾删除>>request.xml。 -
@AndrasDeak,它是
>>而不是>所以,OP 可能不会留下空文件。另外,由于这个命令不会产生任何stdout(因为-i),这可能会起作用,尽管它是错误的方式...... -
@AndrasDeak,
-i不是sed的 POSIX 标准的一部分,并非所有操作系统和实现都提供它。此外,并非所有实现都兼容——sed -i -e 'expression' filename适用于 GNU sed,但不适用于 MacOS sed,后者要求-i后跟文件扩展名以附加到备份(在 GNU 版本中是可选的)。 -
顺便说一句 -- 使用 sed 编辑 xml 非常,非常 非常不受欢迎 -- 当您的输入文件或内容被以较小的方式替代更改。知识库中不乏关于如何正确操作的问题和答案,因此我不会过多地阐述这一点。
-
您的脚本非常脆弱 - 例如,您需要在初始示例中引用
$1...$5,并且您需要转义您正在使用的/在扩展替换时作为 sed 的s命令的分隔符(例如sed -e s/'${SRC}'/"${SRC//\//\\/}"/)。当然,除了删除-i标志。