sed regexp在多行块中查找字符串块并删除字符串,直到它以空格结束



我尝试捕获这些字符串块,并使用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:&quot的注释,它也会删除"AppServer2:&quot的注释,它看起来像这样:

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:]]?//:删除第一个#,后跟一个可选的空格

最新更新