我尝试捕获这些字符串块,并使用regexp和sed删除对它们的注释。每个块之间用空格分隔
some text here
some text here
# AppServer1:
# name: ${AppServer1.name}
# ip: ${AppServer1.ip}
some text here
some text here
# AppServer2:
# name: ${AppServer1.name}
# ip: ${AppServer1.ip}
some text here
some text here
我试着用这个regexp:
sed '/^AppServer1/I{:a; /^[[:blank:]]*$/!{s/.*#.*/&/; n; ba;} }' file
但不影响字符串
我在这里缺少什么来取消整个字符串的注释:
AppServer1:
name: ${AppServer1.name}
ip: ${AppServer1.ip}
更新在实现@anubhava解决方案后,我注意到如果字符串是注意到额外的"#"在代码块之间:
some text here
some text here
# AppServer1:
# name: ${AppServer1.name}
# ip: ${AppServer1.ip}
#
# AppServer2:
# name: ${AppServer1.name}
# ip: ${AppServer1.ip}
some text here
some text here
我想只删除"AppServer1:"的注释,它也会删除"AppServer2:"的注释,它看起来像这样:
AppServer1:
name: ${AppServer1.name}
ip: ${AppServer1.ip}
AppServer2:
name: ${AppServer1.name}
ip: ${AppServer1.ip}
如果有人不小心设置了额外的"#",就会发生这种情况。我怎么能在regexp中添加这个OR条件,所以如果它是空行或一行中的1 #不继续取消注释?
我发现至少有几个问题:
/^AppServer1/
将仅从行开始匹配,但您正在寻找注释块。从regexp中删除^
以匹配行中的任何地方,或者/#[[:blank:]]*AppServer1/
更适合您s/.*#.*/&/
不做任何改变线。匹配的内容将再次用作替换。s/.*#//
将删除从行开始直到最后出现#
的所有内容
你也可以使用地址范围来代替手工构建一个循环:
sed '/#[[:blank:]]*AppServer1/I, /^[[:blank:]]*$/ { s/.*#// }'
您可以尝试这个gnu-sed
,它不需要在以/# AppServer1/
:
sed -E '/^#[[:blank:]]*AppServer1:/I, /^#?[[:blank:]]*$|^($|[^#])/ s/#[[:blank:]]?//' file
some text here
some text here
AppServer1:
name: ${AppServer1.name}
ip: ${AppServer1.ip}
# AppServer2:
# name: ${AppServer1.name}
# ip: ${AppServer1.ip}
some text here
some text here
细节:
/^#[[:blank:]]*AppServer1:/I
:从#
和AppServer1:
(忽略大小写)开头的行开始,/^#?[[:blank:]]*$|^($|[^#])/
:范围以仅具有#
或行开头没有#
的行结束s/#[[:blank:]]?//
:删除第一个#
,后跟一个可选的空格