我发现下面的sed end-case没有任何意义,但我不知道为什么,我不能进一步简化它。
基本上,我想要更改一行并删除一系列行,如下所示:
$ seq 9 | sed '/3/s/$/==/; /4/,/6/d;'
1
2
3==
7
8
9然而,当涉及到以下实际代码时,我想要更改一行并删除一系列行,它不再适用于我(如果我取消对第一个命令的注释):
$ cat ./grub2clean.why-0.sed
#/menuentry/{ s/^/\n/; s/--\(class\|id\) .*$/\{/ };
# WHY?!
/Ubuntu/s/Ubuntu/UUUU/;
/^submenu /,/^}/d;
/UUUU/s/UUUU/!Ubuntu/;我正在运行:
sed -f ./grub2clean.why-0.sed grub.test.cfg
如果我取消对第一个命令的注释,则处于两个有效替换中间的delete-a-range- of -line命令将不再起作用。
这太奇怪了,我不知道为什么。
求求你,谁来救救我!
grub.test.cfg文件为:
more here
menuentry 'Ubuntu 20.04 LTS (20.04) (on /dev/sda3)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-simple-dcf03c24-3d0d-4581-be1d-67b90f92a2c1' {
insmod part_gpt
insmod ext2
set root='hd0,gpt3'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt3 --hint-efi=hd0,gpt3 --hint-baremetal=ahci0,gpt3 dcf03c24-3d0d-4581-be1d-67b90f92a2c1
else
search --no-floppy --fs-uuid --set=root dcf03c24-3d0d-4581-be1d-67b90f92a2c1
fi
linux /boot/vmlinuz-5.4.0-33-generic root=UUID=dcf03c24-3d0d-4581-be1d-67b90f92a2c1 ro net.ifnames=0
initrd /boot/initrd.img-5.4.0-33-generic
}
submenu 'Advanced options for Ubuntu 20.04 LTS (20.04) (on /dev/sda3)' $menuentry_id_option 'osprober-gnulinux-advanced-dcf03c24-3d0d-4581-be1d-67b90f92a2c1' {
menuentry 'Ubuntu (on /dev/sda3)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-5.4.0-33-generic--dcf03c24-3d0d-4581-be1d-67b90f92a2c1' {
insmod part_gpt
insmod ext2
set root='hd0,gpt3'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt3 --hint-efi=hd0,gpt3 --hint-baremetal=ahci0,gpt3 dcf03c24-3d0d-4581-be1d-67b90f92a2c1
else
search --no-floppy --fs-uuid --set=root dcf03c24-3d0d-4581-be1d-67b90f92a2c1
fi
linux /boot/vmlinuz-5.4.0-33-generic root=UUID=dcf03c24-3d0d-4581-be1d-67b90f92a2c1 ro net.ifnames=0
initrd /boot/initrd.img-5.4.0-33-generic
}
menuentry 'Ubuntu, with Linux 5.4.0-33-generic (recovery mode) (on /dev/sda3)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-5.4.0-33-generic-root=UUID=dcf03c24-3d0d-4581-be1d-67b90f92a2c1 ro recovery nomodeset-dcf03c24-3d0d-4581-be1d-67b90f92a2c1' {
insmod part_gpt
insmod ext2
set root='hd0,gpt3'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt3 --hint-efi=hd0,gpt3 --hint-baremetal=ahci0,gpt3 dcf03c24-3d0d-4581-be1d-67b90f92a2c1
else
search --no-floppy --fs-uuid --set=root dcf03c24-3d0d-4581-be1d-67b90f92a2c1
fi
linux /boot/vmlinuz-5.4.0-33-generic root=UUID=dcf03c24-3d0d-4581-be1d-67b90f92a2c1 ro recovery nomodeset
initrd /boot/initrd.img-5.4.0-33-generic
}
}
menuentry 'Ubuntu 19.04 (19.04) (on /dev/sda7)' --class ubuntu --class gnu-linux -
-class gnu --class os $menuentry_id_option 'osprober-gnulinux-simple-db9e32bf-a209
-453f-9eb9-82123fc46652' {
insmod part_gpt
insmod ext2
set root='hd0,gpt7'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=
hd0,gpt7 --hint-baremetal=ahci0,gpt7 db9e32bf-a209-453f-9eb9-82123fc46652
else
search --no-floppy --fs-uuid --set=root db9e32bf-a209-453f-9eb9-82123fc46652
fi
linux /vmlinuz root=/dev/sda7
initrd /initrd.img
}
submenu 'Advanced options for Ubuntu 19.04 (19.04) (on /dev/sda7)' $menuentry_id_option 'osprober-gnulinux-advanced-db9e32bf-a209-453f-9eb9-82123fc46652' {
menuentry 'Ubuntu 19.04 (19.04) (on /dev/sda7)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/vmlinuz--db9e32bf-a209-453f-9eb9-82123fc46652' {
insmod part_gpt
insmod ext2
set root='hd0,gpt7'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7 db9e32bf-a209-453f-9eb9-82123fc46652
else
search --no-floppy --fs-uuid --set=root db9e32bf-a209-453f-9eb9-82123fc46652
fi
linux /vmlinuz root=/dev/sda7
initrd /initrd.img
}
menuentry 'Ubuntu 19.04 (19.04) (on /dev/sda7)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/vmlinuz--db9e32bf-a209-453f-9eb9-82123fc46652' {
insmod part_gpt
insmod ext2
set root='hd0,gpt7'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7 db9e32bf-a209-453f-9eb9-82123fc46652
else
search --no-floppy --fs-uuid --set=root db9e32bf-a209-453f-9eb9-82123fc46652
fi
linux /vmlinuz root=/dev/sda7
initrd /initrd.img
}
menuentry 'Ubuntu 19.04 (19.04) (on /dev/sda7)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/vmlinuz--db9e32bf-a209-453f-9eb9-82123fc46652' {
insmod part_gpt
insmod ext2
set root='hd0,gpt7'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7 db9e32bf-a209-453f-9eb9-82123fc46652
else
search --no-floppy --fs-uuid --set=root db9e32bf-a209-453f-9eb9-82123fc46652
fi
linux /vmlinuz root=/dev/sda7
initrd /initrd.img.old
}
menuentry 'Ubuntu 19.04 (19.04) (on /dev/sda7)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/vmlinuz.old--db9e32bf-a209-453f-9eb9-82123fc46652' {
insmod part_gpt
insmod ext2
set root='hd0,gpt7'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7 db9e32bf-a209-453f-9eb9-82123fc46652
else
search --no-floppy --fs-uuid --set=root db9e32bf-a209-453f-9eb9-82123fc46652
fi
linux /vmlinuz.old root=/dev/sda7
initrd /initrd.img.old
}
}
more here在以下两个操作系统下进行测试,
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux bullseye/sid
Release: 10.10
Codename: buster和
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04 LTS
Release: 20.04
Codename: focal
$ sed --version
sed (GNU sed) 4.7
...
$ apt-cache policy sed
sed:
Installed: 4.7-1
Candidate: 4.7-1
Version table:
*** 4.7-1 500
500 http://archive.ubuntu.com/ubuntu focal/main amd64 Packages
100 /var/lib/dpkg/status发布于 2021-10-21 03:02:42
在您的第一个sed命令中,查找任何包含menuentry的行,并插入一个换行符作为该行的第一个字符。
然后在delete命令中,范围从以submenu开头的行到以右大括号开头的行。
当脚本在任何包含menuentry的行的第一个字符中放入一个换行符时,它还会把一个字符作为以submenu开头的行的第一个字符,因为这些行在$menuentry_id_option位中也包含menuentry。
因此,在第一个sed命令之后,没有任何以submenu开头的行-所有这些行现在都以换行符开头。
因此,您的第一个sed命令应该只匹配以menuentry开头的行和可选的前导空格,或者delete命令应该查找以换行符开头、后面跟submenu的行。
https://stackoverflow.com/questions/69655000
复制相似问题