shell 如何在替换模式包含变量的特定行中替换单词?

gpnt7bae  于 2022-12-13  发布在  Shell
关注(0)|答案(1)|浏览(118)

我有以下文件:

[root@f9044b5d9d1e aws-marketing-and-sales]# grep -HRe ".*\/common\/.*\${local.parent_folder_name}" *
ap-northeast-1/config/config/terragrunt.hcl:  inline_policy = templatefile("${get_parent_terragrunt_dir()}/common/${local.environment}/config/${local.parent_folder_name}/inline-policy-s3.tpl", {
ap-northeast-2/config/config/terragrunt.hcl:  inline_policy = templatefile("${get_parent_terragrunt_dir()}/common/${local.environment}/config/${local.parent_folder_name}/inline-policy-s3.tpl", {
ap-south-1/config/config/terragrunt.hcl:  inline_policy = templatefile("${get_parent_terragrunt_dir()}/common/${local.environment}/config/${local.parent_folder_name}/inline-policy-s3.tpl", {
ap-southeast-1/config/config/terragrunt.hcl:  inline_policy = templatefile("${get_parent_terragrunt_dir()}/common/${local.environment}/config/${local.parent_folder_name}/inline-policy-s3.tpl", {

我尝试将所有文件中出现的“${local.parent_folder_name}”替换为父文件夹名称,其中该行包含“common”,如下所示:

for file in $(grep -HRe ".*\/common\/.*\${local.parent_folder_name}" *); do
  filename=$(echo $file | cut -d: -f1)
  parent=$(echo $file | rev | cut -d/ -f2 | rev)
  sed -i "/common/\${local.parent_folder_name}/$parent/g" $filename
done

这是我在运行上述脚本时遇到的错误:

sed: -e expression #1, char 9: unknown command: `$'

我发现了一些关于这方面的问题,但是没有一个有使用变量作为替换模式的例子。
我也尝试过不同的分隔符(|,!)但无济于事。
编辑:@moshe,它没有工作,这是输出:

grep -Re "/common\/.*\${local.parent_folder_name}" . | while read -r grep_line; do
  if [[ $grep_line == *"$0"* ]]; then
    continue
  fi
  echo $grep_line
  filename=$(echo $grep_line | cut -d: -f1)
  parent=$(echo $grep_line | rev | cut -d/ -f2 | rev)
  echo "parent: $parent"
  sed -i "/common/s?\${local.parent_folder_name}?$parent?g" $filename
done
./ca-central-1/config/config/terragrunt.hcl:  inline_policy = templatefile("${get_parent_terragrunt_dir()}/common/${local.environment}/config/${local.parent_folder_name}/inline-policy-s3.tpl", {
parent: ${local.parent_folder_name}
sed: 1: "./ca-central-1/config/c ...": invalid command code .
./us-west-2/config/config/terragrunt.hcl:  inline_policy = templatefile("${get_parent_terragrunt_dir()}/common/${local.environment}/config/${local.parent_folder_name}/inline-policy-s3.tpl", {

我试着把第一个grep中的“.”替换成“8”,但它只对一些文件起作用,而不是对所有文件起作用。有什么想法吗?
我做错了什么?

ubbxdtey

ubbxdtey1#

不确定parent变量应该是什么,可能应该修复它,但脚本可能是这样的

#!/bin/bash
grep -re "/common\/.*\${local.parent_folder_name}" . | while read -r grep_line; do
  if [[ $grep_line == *"$0"* ]]; then
    continue
  fi
  echo $grep_line
  filename=$(echo $grep_line | cut -d: -f1)
  parent=$(echo $grep_line | rev | cut -d/ -f2 | rev)
  echo "parent: $parent"
  sed -i "/common/s?\${local.parent_folder_name}?$parent?g" $filename
done

请注意,sed接受一个模式(/common/),然后接受一个命令(a用于追加,d用于删除,s用于替换)
我们只想更改模式为/common/的行,因此在模式之后,我们执行常规搜索并替换-s/\${local.parent_folder_name}/$parent/g
为了使它更易读,我将分隔符/更改为?
因此sed为:

sed -i "/common/s?\${local.parent_folder_name}?$parent?g" $filename

相关问题