2013-07-28 33 views
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的为好,但我想这应该是一个小的修复

+2

您应该为此使用XML解析器。 – Endoro

+0

sed是一个很好的简单替换工具,对于任何其他文本操作,您应该使用awk,因为生成的脚本将更简单,更健壮,更易于扩展并且通常更简洁。如果您告诉我们您要做什么,我们可以提供帮助 - 期待我们从您发布的输出中进行猜测,而非工作sed脚本不是一个好方法。 –

+0

@EdMorton我简要地表达了我想要做的事情。引用“复制粘贴部分(从密钥标签到字典标签),然后更改该部分的密钥(密钥标签)”。我太简短了吗?是否可以发布一个关于如何使用awk来做到这一点的答案? –

回答

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 ;