在多个文件中查找并替换多行块(bash/linux)

在多个文件中查找并替换多行块(bash/linux)

我正在尝试找到一种方法来找到符合条件的文本块:

  1. 块以“google = {”开头
  2. 块以找到下一个“}”字符结束 - 忽略其他所有内容。

例子

google = {
  block of text with some var = "value" assignments
  usually 1-3 lines of code here.
  often includes special chars like / " > < = 
}

替换至特定块:

google = {
  source  = "hashicorp/google"
  version = ">= 4.0.0, <5.0.0"
}

对于所有子目录(多个文件)中名为versions.tf的所有文件。

我能够使用 sed 为单个文件找到特定的块:

$ sed -e '/google = {/,/}/!d' versions.tf

google = {
  source  = "hashicorp/google"
  version = ">= 3.32, <4.0.0"
}

但是我很难修改它以递归方式工作并用其他固定值替换找到的块。

使用 perl 的其他方法似乎可以解决单个文件的问题:

perl -i~ -0777 -pe 's/google = \{[^\}]+"/google = {\n      source  = \"hashicorp\/google\"\n      version = \">= 4.0.0, <5.0.0\"\n    }/g' versions.tf

但这不是最漂亮的解决方案;)

相关内容