Macos 使用sed编辑多行文本

Macos 使用sed编辑多行文本,macos,sed,Macos,Sed,我在MacOSX上(使用Apple sed而不是GNU sed),我有一个这样的文本文件 <key>wolf die se0000.bmp</key> <dict> <key>frame</key> <string>{{288,224},{44,68}}</string> <

我在MacOSX上(使用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>
wolf die se0000.bmp
框架
{{288,224},{44,68}}
wolf die se0001.bmp
框架
{{288,224},{44,68}}
wolf die w0000.bmp
框架
{{288,224},{44,68}}
我想复制粘贴一些部分并修改密钥,使文件如下所示:

        <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>
wolf die se0000.bmp
框架
{{288,224},{44,68}}
狼站se0000.bmp
框架
{{288,224},{44,68}}
wolf die se0001.bmp
框架
{{288,224},{44,68}}
wolf die w0000.bmp
框架
{{288,224},{44,68}}
狼站w0000.bmp
框架
{{288,224},{44,68}}
因此,我尝试使用这样的sed命令来实现所需的效果(test.plist是包含第一段文本的文件):

sed-E-n'
1h
1.H
$ {
G
狼之死([a-z]{1,2})(0000)(.*)/\1\2\3\4\n狼之站\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>
wolf die se0000.bmp
框架
{{288,224},{44,68}}
wolf die se0001.bmp
框架
{{288,224},{44,68}}
wolf die w0000.bmp
框架
{{288,224},{44,68}}
nwolf展位se 0000.bmp
框架
{{288,224},{44,68}}
wolf die se0001.bmp
框架
{{288,224},{44,68}}
wolf die w0000.bmp
框架
{{288,224},{44,68}}
我如何纠正这个问题


PS:我对这款Apple sed也没有什么新意,但我认为这应该是一个小小的修复

使用适当的XML处理工具,例如:


为此,您应该使用XML解析器。sed是一个很好的工具,用于在单行上进行简单替换,对于任何其他文本操作,您应该使用awk,因为生成的脚本将更简单、更健壮、更易于扩展,并且通常更简洁。如果您告诉我们您想做什么,我们可以提供帮助—期望我们从您发布的输出和不工作的sed脚本中猜测不是一个好方法。@EdMorton我已经简单地表达了我想做的事情。引用“复制粘贴节(从键标记到dict标记),然后更改该节的键(键标记)”。我是不是太简短了?有没有可能发布一个关于如何使用awk实现这一点的答案?
            <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>
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 ;