SED删除注释但保留特定的否定注释字符串

时间:2018-03-14 21:43:08

标签: sed comments negation

我试图从文件中删除评论,但重要的是我想留下特定字符串:

## Something
# START
# END

这些必须留在休息而不是注释线,我想用" d" - 这个很重要。我不想使用打印否定或其他技巧,因为这个sed命令稍后会使用额外的" -e"来处理其他事情。

以下是示例文件:

# START
group1: user1@domain.com, user2@domain.com, user3@domain.com
group2: user3@domain.com, user4@domain.com

# S
#STAR
# start
# star
# comment is here
## Owner1
group3: user1@domain.com, user3@domain.com

## Owner2
group4: user4@domain.com, user3@domain.com

group3: user2@domain.com, user3@domain.com

# END

group5: user4@domain.com
alias1: user6@domain.com

我尝试使用如下命令:

sed -e '/^#[^#]/d' sample.file

删除以&#34开头的每一行;#"而下一个角色不是"#"所以它离开" ##"如何管理删除休息而不会丢失#START和#END行?

我需要在没有管道的同一命令中执行此操作,"!p"或" p"版本必须是这个" d"修改版。 尝试过这样的事情:

sed -e '/^#[^#][^S][^T][^A][^R][^T]/d'

sed -e '/^#[^#]\([^S][^T][^A][^R][^T]\|[^E][^N][^D]\)/d'

但没有任何方法按照我想要的方式运作。 我不确定这是否可行。

预期产出:

# START
group1: user1@domain.com, user2@domain.com, user3@domain.com
group2: user3@domain.com, user4@domain.com

## Owner1
group3: user1@domain.com, user3@domain.com

## Owner2
group4: user4@domain.com, user3@domain.com

group3: user2@domain.com, user3@domain.com

# END

group5: user4@domain.com
alias1: user6@domain.com

问候&谢谢你的帮助:)

2 个答案:

答案 0 :(得分:3)

尝试:

sed -E '/^##|^# START|^# END/bskip; /^#/d; :skip' file

实施例

$ sed -E '/^##|^# START|^# END/bskip; /^#/d; :skip' file
# START
group1: user1@domain.com, user2@domain.com, user3@domain.com
group2: user3@domain.com, user4@domain.com

## Owner1
group3: user1@domain.com, user3@domain.com

## Owner2
group4: user4@domain.com, user3@domain.com

group3: user2@domain.com, user3@domain.com

# END

group5: user4@domain.com
alias1: user6@domain.com

如何运作

  • /^##|^# START|^# END/bskip

    对于符合^##^# START^# END的任何行,我们会转移到标签skip

  • /^#/d

    对于以#开头的所有其他行,我们会删除。

  • :skip

    这定义了标签skip

BSD / MACOS

以上用GNU sed测试。对于BSD / macOS sed,请尝试:

sed -E -e '/^##|^# START|^# END/bskip' -e '/^#/d' -e ':skip' file

答案 1 :(得分:0)

这比John1024s的答案更冗长,但也有效:

sed -r 's/# ((START)|(END)).*/## \1/;/^#[^#].*/d;s/## ((START)|(END))/# \1/;' sample.conf

将#START / END注释转移到受保护的##格式,然后进行转换,然后将其转换为#START / END。

首先,我已经监督了'no- / p'-requierement,然后明显的解决方案是:

sed -r '/# (START)|(END).*/p;/^#[^#].*/d' sample.conf 

您可以使用简单的print-pattern / p。

,而不是删除复杂的删除模式/ d

请注意,[^S][^T][^A][^R][^T]会匹配“END”(有2个尾随空格 - 可能不太可能,但如果需要另外处理3或5个字母的异常,则会变得难看,如果不是alread。