首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个sed最终案例没有意义,我也不知道为什么

这个sed最终案例没有意义,我也不知道为什么
EN

Stack Overflow用户
提问于 2021-10-21 02:07:02
回答 1查看 29关注 0票数 0

我发现下面的sed end-case没有任何意义,但我不知道为什么,我不能进一步简化它。

基本上,我想要更改一行并删除一系列行,如下所示:

代码语言:javascript
复制
$ seq 9 | sed '/3/s/$/==/; /4/,/6/d;'
1
2
3==
7
8
9

然而,当涉及到以下实际代码时,我想要更改一行并删除一系列行,它不再适用于我(如果我取消对第一个命令的注释):

代码语言:javascript
复制
$ 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文件为:

代码语言:javascript
复制
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

在以下两个操作系统下进行测试,

代码语言:javascript
复制
$ lsb_release -a 
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux bullseye/sid
Release:        10.10
Codename:       buster

代码语言:javascript
复制
$ 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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-21 03:02:42

在您的第一个sed命令中,查找任何包含menuentry的行,并插入一个换行符作为该行的第一个字符。

然后在delete命令中,范围从以submenu开头的行到以右大括号开头的行。

当脚本在任何包含menuentry的行的第一个字符中放入一个换行符时,它还会把一个字符作为以submenu开头的行的第一个字符,因为这些行在$menuentry_id_option位中也包含menuentry

因此,在第一个sed命令之后,没有任何以submenu开头的行-所有这些行现在都以换行符开头。

因此,您的第一个sed命令应该只匹配以menuentry开头的行和可选的前导空格,或者delete命令应该查找以换行符开头、后面跟submenu的行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69655000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档