gpt4 book ai didi

unix - 从 sed/START/,/END/中排除第一行和最后一行

转载 作者:行者123 更新时间:2023-12-02 09:38:12 26 4
gpt4 key购买 nike

考虑输入:

=sec1=
some-line
some-other-line

foo
bar=baz

=sec2=
c=baz

如果我只想处理 =sec1= 我可以例如通过以下方式注释掉该部分:
sed -e '/=sec1=/,/=[a-z]*=/s:^:#:' < input

……嗯,差不多。

这将注释包括“=sec1=”和“=sec2=”行的行,结果将类似于:
#=sec1=
#some-line
#some-other-line
#
#foo
#bar=baz
#
#=sec2=
c=baz

我的问题是: 从 sed 中的/START/,/END/范围中排除开始和结束行的最简单方法是什么? ?

我知道在许多情况下,“s:::”爪的细化可以在这种特定情况下提供解决方案,但我在这里寻求通用解决方案。

在“ Sed - An Introduction and Tutorial”中,Bruce Barnett 写道:“稍后我将向您展示如何将命令限制到,但不包括包含指定模式的行。”,但我无法找到他实际显示这一点的位置。

在 Eric Pement 编译的“ USEFUL ONE-LINE SCRIPTS FOR SED”中,我只能找到包含示例:
# print section of file between two regular expressions (inclusive)
sed -n '/Iowa/,/Montana/p' # case sensitive

最佳答案

这应该可以解决问题:

sed -e '/=sec1=/,/=sec2=/ { /=sec1=/b; /=sec2=/b; s/^/#/ }' < input

这在 sec1 和 sec2 之间匹配,然后只是跳过第一行和最后一行 b命令。这将在 sec1 和 sec2(不包括)和 s 之间留下所需的行。命令添加注释符号。

不幸的是,您确实需要重复使用正则表达式来匹配分隔符。据我所知,没有更好的方法可以做到这一点。至少你可以保持正则表达式干净,即使它们被使用了两次。

这是改编自 SED FAQ: How do I address all the lines between RE1 and RE2, excluding the lines themselves?

关于unix - 从 sed/START/,/END/中排除第一行和最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1187354/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com