【发布时间】:2013-07-29 03:26:34
【问题描述】:
我在 Mac OS X 上(使用 Apple sed 而不是 GNU 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:我也没有得到这个 Apple sed 的换行符,但我认为这应该是一个小修复
【问题讨论】:
-
您应该为此使用 XML 解析器。
-
sed 是用于在单行上进行简单替换的出色工具,对于任何其他文本操作,您应该使用 awk,因为生成的脚本将更简单、更健壮、更易于扩展并且通常更简洁。如果您告诉我们您正在尝试做什么,我们可以提供帮助 - 期望我们从您发布的输出中猜测并且不工作的 sed 脚本不是一个好方法。
-
@EdMorton 我已经简要地表达了我想做的事情。引用“复制粘贴一个部分(从键标签到dict标签),然后更改该部分的键(键标签)”。我是不是太简短了?是否可以发布有关如何使用 awk 执行此操作的答案?