如何在sed命令中使用\

时间:2018-07-17 12:29:51

标签: bash shell sed

我有一个要用sed命令替换的字符串文件。

文件中的字符串:

 <ItemGroup>
    <None Include="xyz.config" />
    <BundleResource Include="Settings.txt" />
    <BundleResource Include="Resources\Base.lproj\Localizable.strings" /> <BundleResource Include="Resources\Base.lproj\InfoPlist.strings" />
  </ItemGroup>

下面是我的命令:

CONTENT="<BundleResource Include="Resources\Base.lproj\Localizable.strings" /><BundleResource Include="Resources\Base.lproj\InfoPlist.strings" /><BundleResource Include="Resources\es.lproj\Localizable.strings" /><BundleResource Include="Resources\es.lproj\Infoplist.strings" />"

sed -i "s|\.*<BundleResource Include=\"Resources\\Base.lproj\\.*|${CONTENT}|g" 

但是当我使用上面的sed命令时,它并没有取代它。你知道为什么吗?我的sed命令是否做错了?

我想要的最终结果是:

  <ItemGroup>
    <None Include="xyz.config" />
    <BundleResource Include="Settings.txt" />
    <BundleResource Include="Resources\Base.lproj\Localizable.strings" /> 
    <BundleResource Include="Resources\Base.lproj\InfoPlist.strings" /> 
    <BundleResource Include="Resources\es.lproj\Localizable.strings" /> 
    <BundleResource Include="Resources\es.lproj\Infoplist.strings" />
  </ItemGroup>

谢谢!

2 个答案:

答案 0 :(得分:2)

这是bashsed反斜杠引用的问题。如果您尝试

sed -i "s|\.*<BundleResource Include=\"Resources\\\\Base.lproj\\\\.*|${CONTENT}|g"

它应该做您想要的。 bashsed都在崩溃,所以您需要四个!

此外,在将包含双引号的字符串分配给CONTENT时,您已经使用了双引号,但这并不能满足您的要求。试试单引号:

CONTENT='<BundleResource Include="Resources\Base.lproj\Localizable.strings" /><BundleResource Include="Resources\Base.lproj\InfoPlist.strings" /><BundleResource Include="Resources\es.lproj\Localizable.strings" /><BundleResource Include="Resources\es.lproj\Infoplist.strings" />'

也就是说,正如评论者所指出的那样,最好使用适当的XML工具而不是sed

答案 1 :(得分:1)

如chepner所述,您可能应该使用xml工具而不是SED来编辑它,但是,如果要使用SED,则可能需要这样的东西:

sed "s|<BundleResource Include=\"Resources\\\\Base.lproj\\\\[^>]*>|${CONTENT}|g" < tmp.txt

我替换了.*,因为它们可能会出现问题。第二个.*[^>]>替换,因此它仅匹配/替换直到下一个>字符。我还两次转义了\字符。