2
我在Mac OS X(使用Apple sed而不是GNU sed),并且我有一个这样的文本文件。使用sed编辑多行文字
<key>wolf die se0000.bmp</key>
<dict>
<key>frame</key>
<string>{{288,224},{44,68}}</string>
</dict>
<key>wolf die se0001.bmp</key>
<dict>
<key>frame</key>
<string>{{288,224},{44,68}}</string>
</dict>
<key>wolf die w0000.bmp</key>
<dict>
<key>frame</key>
<string>{{288,224},{44,68}}</string>
</dict>
我要复制粘贴一些章节和修改密钥这样文件看起来是这样的:
<key>wolf die se0000.bmp</key>
<dict>
<key>frame</key>
<string>{{288,224},{44,68}}</string>
</dict>
<key>wolf stand se0000.bmp</key>
<dict>
<key>frame</key>
<string>{{288,224},{44,68}}</string>
</dict>
<key>wolf die se0001.bmp</key>
<dict>
<key>frame</key>
<string>{{288,224},{44,68}}</string>
</dict>
<key>wolf die w0000.bmp</key>
<dict>
<key>frame</key>
<string>{{288,224},{44,68}}</string>
</dict>
<key>wolf stand w0000.bmp</key>
<dict>
<key>frame</key>
<string>{{288,224},{44,68}}</string>
</dict>
所以,我试图用一个sed命令是这样来达到预期的效果(test.plist是第一段文本的文件):
sed -E -n '
1h
1!H
$ {
g
s/(<key>wolf die)([a-z]{1,2})(0000)(.*<\/dict>)/\1\2\3\4\n<key>wolf stand \2 0000\4/
p
}
' test.plist
我没有得到想要的结果。我希望它在看到第一个标签后就终止了,然后进行替换,然后跟随,但是我的sed专业知识对于实现这一点非常不利。
我得到实际的输出是:
<key>wolf die se0000.bmp</key>
<dict>
<key>frame</key>
<string>{{288,224},{44,68}}</string>
</dict>
<key>wolf die se0001.bmp</key>
<dict>
<key>frame</key>
<string>{{288,224},{44,68}}</string>
</dict>
<key>wolf die w0000.bmp</key>
<dict>
<key>frame</key>
<string>{{288,224},{44,68}}</string>
</dict>n<key>wolf stand se 0000.bmp</key>
<dict>
<key>frame</key>
<string>{{288,224},{44,68}}</string>
</dict>
<key>wolf die se0001.bmp</key>
<dict>
<key>frame</key>
<string>{{288,224},{44,68}}</string>
</dict>
<key>wolf die w0000.bmp</key>
<dict>
<key>frame</key>
<string>{{288,224},{44,68}}</string>
</dict>
如何纠正呢?
PS:我没有得到这个苹果的换行符sed的为好,但我想这应该是一个小的修复
您应该为此使用XML解析器。 – Endoro
sed是一个很好的简单替换工具,对于任何其他文本操作,您应该使用awk,因为生成的脚本将更简单,更健壮,更易于扩展并且通常更简洁。如果您告诉我们您要做什么,我们可以提供帮助 - 期待我们从您发布的输出中进行猜测,而非工作sed脚本不是一个好方法。 –
@EdMorton我简要地表达了我想要做的事情。引用“复制粘贴部分(从密钥标签到字典标签),然后更改该部分的密钥(密钥标签)”。我太简短了吗?是否可以发布一个关于如何使用awk来做到这一点的答案? –