什么是正确的sed就地字符串替换语法?

时间:2018-01-05 19:01:49

标签: shell sed

我正在尝试替换文件中的一行,这是我当前的shell脚本:

sed -i "s%$line%$line_formatted%g" $file_source

每当我尝试将$line替换为$line_formatted时,我都会收到此错误:

sed: -e expression #1, char 81: unknown option to `s'

我只是想知道正确的语法是什么?

尝试下面的评论,它仍然不会替换文本。这是我使用的代码:

echo "Here is line: "$line
echo "Here is line_formatted: "$line_formatted

# sed -i "s%$line%$line_formatted%g" $topicJRXML_file_source

awk -v old="$line" -v new="$line_formatted" '
s=index($0,old) { $0 = substr($0,1,s-1) new substr($0,s+length(old)) }
' $topicJRXML_file_source

cp "$topicJRXML_file_source" "$topicJRXML_file_destination"
echo "Here is line after awk: "$line

这是我的控制台输出:

Here is line:  <property name="adhoc.display" value="Awk Test"/>
Here is line_formatted:  <property name="adhoc.display" value="$R{CUSTOM.Awk_Test.LABEL}"/>
Here is line after awk:  <property name="adhoc.display" value="Awk Test"/>

2 个答案:

答案 0 :(得分:1)

请参阅http://stackoverflow.com/q/29613304/1745001,了解使用sed做你想做的事情的可怕任务,而不是试图强迫sed假装它在文字字符串操作时不支持它们,只是使用awk:

awk -v old="$line" -v new="$line_formatted" '
    s=index($0,old) { $0 = substr($0,1,s-1) new substr($0,s+length(old)) }
    { print }
' file

答案 1 :(得分:0)

鉴于文件update-adhoc-display.xslt中保存了以下XSLT模板:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:param name="newValue"/>

  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="//property[@name='adhoc.display']/@value">
    <xsl:attribute name="value">
      <xsl:value-of select="$newValue"/>
    </xsl:attribute>
  </xsl:template>
</xsl:stylesheet>

......以下命令:

xsltproc \
  --stringParam newValue "Updated Value" \
  update-adhoc-display.xslt in.xml >out.xml

...将转换输入文档:

<root>
  <property name="adhoc.display" value="Initial Value 1"/>
  <property name="other.content" value="Initial Value 2"/>
</root>

...输出文件:

<root>
  <property name="adhoc.display" value="Updated Value"/>
  <property name="other.content" value="Initial Value 2"/>
</root>

https://stackoverflow.com/a/6873226/14122 @Mithfindel的强烈启发,以及 - 作为已知副本的答案 - 被标记为社区Wiki。