sed不是从bash里面工作的

时间:2016-06-29 14:47:04

标签: xml bash sed

我尝试使用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运行,但在调用脚本时文件没有变化。

任何帮助将不胜感激。

3 个答案:

答案 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

备注

  1. 就地编辑选项-i可使文件中的更改生效。
  2. 您永远不应该request.xml >> request.xml,即同时读取和写入文件
  3. 双引号变量没有坏处(例如SRC="$1")。这样可以防止变量中的单词分裂。
  4. 带有sed的-E选项更具可移植性,并且现在已被大多数sed版本识别。
  5. 修改
    如果未启用扩展正则表达式,则可以编写如下所示的sed语句:

    sed -i 's/\${SRC}/'"$src"'/g;s/\${MSG}/'"$msg"'/g' request.xml
    

答案 2 :(得分:0)

检查系统上的sed路径/usr/bin/sed。 它是我的/bin/sed