如何将文件的一部分移动到最后

时间:2009-08-17 08:59:13

标签: sed text-processing

rpm会自动将新安装的内核作为第一个选项。但是,我想把它作为最后一个 - 移到文件的末尾。

Grub配置文件如下所示:

default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Fedora (2.6.29.6-217.2.7.fc11.x86_64)
    root (hd0,0)
    kernel /vmlinuz-2.6.29.6-217.2.7.fc11.x86_64 ro root=/dev/mapper/main-root rhgb quiet
    initrd /initrd-2.6.29.6-217.2.7.fc11.x86_64.img
title Fedora (2.6.29.6-217.2.3.fc11.x86_64)
    root (hd0,0)
    kernel /vmlinuz-2.6.29.6-217.2.3.fc11.x86_64 ro root=/dev/mapper/main-root rhgb quiet
    initrd /initrd-2.6.29.6-217.2.3.fc11.x86_64.img
title Fedora (2.6.29.6-213.fc11.x86_64)
    root (hd0,0)
    kernel /vmlinuz-2.6.29.6-213.fc11.x86_64 ro root=/dev/mapper/main-root rhgb quiet
    initrd /initrd-2.6.29.6-213.fc11.x86_64.img

我的目标是将第一个选项(217.2.3)移至结束。现在我想出如何删除它:

sed -e '/(2.6.29.6-217.2.7.fc11.x86_64)/,+3d' /boot/grub/menu.lst

p命令只打印当前行(而不是在vim中,这意味着粘贴)。

您是否有任何想法如何自动将此部分文件移至最后?

2 个答案:

答案 0 :(得分:3)

我必须自己回答。 : - )

sed '/\(2.6.18-157.el5\)/,+4 { H; d; }; $ { p; x; }' /boot/grub/menu.lst

如果你不熟悉sed(我也不熟悉),那么有更详细的版本

sed '
 /\(2.6.18-157.el5\)/,+3 { #Find line which contains version of our kernel in parentheses and took also 3 following lines
  H # Append this line into buffer
  d # Delete line
 }

 $ { # On the last line
 p # Print current line
 x # Change current line with buffer and vice versa
 # Afterwards sed print current line => in our case deleted line
 }' /boot/grub/menu.lst

答案 1 :(得分:0)

一项非常类似的任务被广泛涵盖here

是的,精心设计的sed命令有一些满足感,但我想我会倾向于使用编辑器,所以我可以看到我要移动的线条,而不必担心获取行号命令错了。