我试图从文件中删除评论,但重要的是我想留下特定字符串:
## 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
问候&谢谢你的帮助:)
答案 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
。
以上用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。