我尝试使用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>
我需要将文本$ {SRC}和$ {MSG}替换为来自bash的相应值。目前相同的sed表达式正在替换文本,如果从外部bash运行,但在调用脚本时文件没有变化。
任何帮助将不胜感激。
答案 0 :(得分:3)
忽略您的输入文件是XML,${foo}
是用src=$1; dst=$2; msg=$3; conn=$4; group=$5
tempfile=$(mktemp -t request.xml.XXXXXX)
# to edit request.xml in-place:
SRC=$src DST=$dst MSG=$msg CONN=$conn GROUP=$group envsubst \
<request.xml >"$tempfile" && mv "$tempfile" request.xml
形式的占位符替换同名环境变量中的值的正确工具。
#!/bin/bash
SRC=hello
MSG=world
tempfile=$(mktemp request.xml.XXXXXX)
xmlstarlet ed -u '//*[.="${SRC}"]' -v "$SRC" \
-u '//*[.="${MSG}"]' -v "$MSG" \
<request.xml >"$tempfile" && mv "$tempfile" request.xml
那就是说,如果我们没有忽略它,并选择使用XML感知工具,我们会提出一个完全不同的解决方案:
<?xml version="1.0"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
<soapenv:Header/>
<soapenv:Body>
<tem:SendSMS>
<!--Optional:-->
<tem:Number>hello</tem:Number>
<!--Optional:-->
<tem:AccountID>world</tem:AccountID>
</tem:SendSMS>
</soapenv:Body>
</soapenv:Envelope>
...产生,给定输入文件:
$("#button_test").on("click",function()
{
console.clear();
var length_area = $("#test").width();
var length_value = $("#test").val().length;
var index = Math.trunc(length_area/8);
var finalstr = $("#test").val().substring(0, index) + " " + $("#test").val().substring(index);
console.log(finalstr);
});
...并且保证导致输出具有有效的XML格式,即使要替换的字符串需要被转义或以其他方式修改为在XML中有效。
答案 1 :(得分:0)
下面的脚本将执行:
dst=$2 # Uppercase variables are usually reserved for the system
msg=$3 # So use lowercase variables for your scripts like 'dst','msg' and so
.
.
.
sed -E -i 's/\$\{SRC\}/'"$src"'/g;s/\$\{MSG\}/'"$msg"'/g' request.xml
备注强>
-i
可使文件中的更改生效。request.xml >> request.xml
,即同时读取和写入文件SRC="$1"
)。这样可以防止变量中的单词分裂。-E
选项更具可移植性,并且现在已被大多数sed版本识别。 修改强>
如果未启用扩展正则表达式,则可以编写如下所示的sed语句:
sed -i 's/\${SRC}/'"$src"'/g;s/\${MSG}/'"$msg"'/g' request.xml
答案 2 :(得分:0)
检查系统上的sed路径/usr/bin/sed
。
它是我的/bin/sed
。