【问题标题】:sed - matching multiple lines and insert above the matchsed - 匹配多行并在匹配上方插入
【发布时间】:2014-04-29 13:21:25
【问题描述】:

我有一个看起来像这样的文件

#multi
#line
#comment
$var1=foo

#multi
#line
#comment
$var2=bar

#############################################
#   END                                     #
#############################################

使用 sed(因为我已经在脚本的其他地方使用了 sed,并且我希望保持一致)如何匹配“END”部分,即一个或多个注释标记后跟一个注释 + 空格 + END 和然后添加以下行之前结束部分

#############################################
# user login
#############################################

server.user=$USER
server.pswd=$PASSWD

<newline>
<newline>

请评论你的回答,以便我可以学习,希望不需要提出后续问题

谢谢!

【问题讨论】:

  • 一致性很好,因为它不会因为使用错误的工作工具而导致过度的复杂性。但是,有时您会发现自己处于切换工具可能是更好选择的情况。除非用大锤和撬棍建造新墙听起来很合理,因为这些工具与你用来拆除旧墙的工具相同......
  • 当然!但由于在 unix 中,总有更多的方法可以做到这一点,如果可能的话,我想更喜欢 sed,而不会浪费人们的时间来使用 awk、perl 等来回答......

标签: regex bash sed


【解决方案1】:
 sed '/^##* END$/i\
# user login\
#############################################\
\
server.user=$USER\
server.pswd=$PASSWD\
\
\
#############################################' input

这利用了 END 节的头块只有一行并且与插入块的头相同的事实,因此我们将 END 节的第一行重新用作第一行新节的标题,并为 END 块标题写入新的第一行。 i 命令告诉 sed 在打印缓冲区之前插入文本,转义的换行符允许我们插入多行文本。

【讨论】:

  • "这利用了END部分的头块只有一行,和插入块的头相同"可爱! :-)
  • 感谢您。但是,它似乎与我希望的 2 个条件(^#* 后跟以 #\s END 开头的行)不匹配,所以我总是知道文本是在 end 块之前插入的,而不是在某人之前插入的已在文件的更上方插入了一条评论,即## END OF THE WORLD IS COMING。 sed 可以匹配多行吗?
猜你喜欢
  • 2021-07-15
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
相关资源
最近更新 更多