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的爲好,但我想這應該是一個小的修復
您應該爲此使用XML解析器。 – Endoro
sed是一個很好的簡單替換工具,對於任何其他文本操作,您應該使用awk,因爲生成的腳本將更簡單,更健壯,更易於擴展並且通常更簡潔。如果您告訴我們您要做什麼,我們可以提供幫助 - 期待我們從您發佈的輸出中進行猜測,而非工作sed腳本不是一個好方法。 –
@EdMorton我簡要地表達了我想要做的事情。引用「複製粘貼部分(從密鑰標籤到字典標籤),然後更改該部分的密鑰(密鑰標籤)」。我太簡短了嗎?是否可以發佈一個關於如何使用awk來做到這一點的答案? –