2013-07-28 67 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 ;