sed / awk:从模式到模式中删除线条

时间:2011-07-19 08:59:22

标签: bash sed awk

我的一个配置有一个特定的foo部分:

# Configuration foo - Start
blah
blah
blah
# Configuration foo - End

我想对此部分应用更改,将其替换为另一个文件的内容(例如new_foo.txt)。该部分始终以# Configuration foo - Start开头,以# Configuration foo - Start

结尾

在Ubuntu \ bash生态系统中实现这一目标的最佳方法是什么?我可以写一个小的Python脚本,但我怀疑这个可能有一个优雅的单行。

3 个答案:

答案 0 :(得分:4)

sed -e '/^# Configuration foo - Start$/r new_foo.txt' -e '/^# Configuration foo - Start$/,/^# Configuration foo - End$/d'

答案 1 :(得分:3)

{
  sed -n '0,/^# Configuration foo - Start$/p' infile
  cat new_foo.txt
  sed -n '/^# Configuration foo - End$/,$p' infile
} > outfile

如果你把它全部放在一行上,那么不要忘记在;之前放置一个}和一个空格。

答案 2 :(得分:1)

假设new_foo.txt小到可以保存在内存中,这对我有用:

awk 'NR==FNR {A[i++] = $0} NR>FNR && !exclude {print $0} /# Configuration foo - Start/ {exclude=1; for (line in A) { print line }} /# Configuration foo - End/ {exclude=0; print$0}' new_foo.txt config