【问题标题】:How to replace a word in a specific line where the replace pattern contains a variable?如何替换替换模式包含变量的特定行中的单词?
【发布时间】:2022-12-18 07:08:43
【问题描述】:

我有以下文件:

[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: `$'

我发现了一些与此相关的 SO 问题,但没有一个有使用变量作为替换模式的示例。

我也尝试过不同的分隔符(|,!)但无济于事。

编辑: @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", {

我究竟做错了什么?

【问题讨论】:

    标签: shell sed replace


    【解决方案1】:

    不确定 parent var 应该是什么,可能应该修复它,但脚本可能看起来像那样

    #!/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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 2013-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多