我使用的是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
我没有得到理想的结果。我希望它在看到第一个&lt; / dict&gt;后终止。标记并进行替换然后跟进,但我的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的换行符,但我认为应该是一个小修复答案 0 :(得分:3)
使用适当的XML处理工具,例如xsh:
open file.xml ;
for //key[contains(., 'wolf die')][contains(., '0000')] {
$n := xcp . after ./following-sibling::dict[1] ;
set $n/text() xsh:subst(., ' die ', ' stand ') ;
xcp ./following-sibling::dict[1] after $n ;
}
save :b ;