我有一个要用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>
谢谢!
答案 0 :(得分:2)
这是bash
和sed
反斜杠引用的问题。如果您尝试
sed -i "s|\.*<BundleResource Include=\"Resources\\\\Base.lproj\\\\.*|${CONTENT}|g"
它应该做您想要的。 bash
和sed
都在崩溃,所以您需要四个!
此外,在将包含双引号的字符串分配给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
我替换了.*
,因为它们可能会出现问题。第二个.*
被[^>]>
替换,因此它仅匹配/替换直到下一个>
字符。我还两次转义了\
字符。