首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于多行选择和删除的sed

用于多行选择和删除的sed
EN

Unix & Linux用户
提问于 2021-10-20 02:37:57
回答 3查看 154关注 0票数 0

格式的给定输入

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

. . .

 if test x$grub_platform = xpc; then
   linux_suffix=16; 
 else
   linux_suffix= ; 
 fi

<#>更新:

一开始我没说清楚。“肮脏2”S什么时候会出现?_平台_搜索_提示可能是“否”的问题有更多信息。也就是说,还有其他的if语句,我只想处理feature_platform_search_hint语句。现在把另一个if案例放在上面。

我希望我的sedsearch条件下选择第一个feature_platform_search_hint命令,而忽略/删除整个if命令块:

代码语言:javascript
复制
        set root='hd0,gpt3'
        search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt3 --hint-efi=hd0,gpt3 --hint-baremetal=ahci0,gpt3  dcf03c24-3d0d-4581-be1d-67b90f92a2c1
        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

其余的/剩余的线路完好无损。

下面是我提出的sed命令:

代码语言:javascript
复制
/feature_platform_search_hint/{
# remove if line and keep next
d; N; h;
# remove else block
N; N; N; d;
g; s/  search /search /;
}

但它并没有像我预期的那样起作用。为什么以及如何修复?thx

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2021-10-20 07:34:53

代码语言:javascript
复制
sed '/^ *if \+/d;/^ *else *$/,/^ *fi *$/d' remove_if_block

/^ *if在你的行上面,你有空格,所以空格和asterix前面的'if‘。我不知道你的文件是否真的有。但是,即使有这些代码,上面的代码也应该能工作。如果有人无意中在“after”和“fi”之后添加了空格,则else *$/fi *$的空格用于保护.也可以从其他地方开始,所以.

票数 2
EN

Unix & Linux用户

发布于 2021-10-20 07:58:43

只需将if语句替换为if true; then,就会创建具有相同效果的shell代码。

代码语言:javascript
复制
sed 's/^ *if \[.*]; then/if true; then # &/' file

这将替换if语句,但将原始代码保留在注释中。

票数 1
EN

Unix & Linux用户

发布于 2021-10-21 00:34:44

找到了我的解决方案--无法使用d,它将立即启动下一个周期,而其余的命令则没有处理。

代码语言:javascript
复制
# input:
$ seq 9
1
2
3
4
5
6
7
8
9

# goal: remove line 4 (if), and 6~8 (3-line else block)

$ seq 9 | sed '/4/{N; s/^.*\n//; h; N; N; N; g; }'
1
2
3
5
9
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/673938

复制
相关文章

相似问题

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