xargs sed cmd 错误 xargs: gsed: 没有这样的文件或目录

xargs sed cmd 错误 xargs: gsed: 没有这样的文件或目录

myfiles.hcl我正在尝试替换文件中的以下行

"-var-file=${get_parent_terragrunt_dir()}/variables/eu-west-2.tfvars", 

"-var-file=${get_parent_terragrunt_dir()}/variables/eu-west-2.tfvars",
"-var-file=${get_parent_terragrunt_dir()}/variables/eu-west-2-prod.tfvars",

使用 xargs gsed cmd

 find . -name 'myfiles.hcl' | xargs grep -l 'prod' | xargs gsed -i 's|"-var-file=${get_parent_terragrunt_dir()}/variables/eu-west-2.tfvars",|"-var-file=${get_parent_terragrunt_dir()}/variables/eu-west-2.tfvars",'\\n' "-var-file=${get_parent_terragrunt_dir()}/variables/eu-west-2-prod.tfvars",|'

但我收到错误xargs: gsed: No such file or directory

答案1

您可能使用的是某些非 GNU 系统,例如 *BSD,并且您的sed编写方式无法在大多数sed风格上运行。因此,您可以安装 GNUsed作为gsed,或者只需更改脚本以与您的sed.我可以看到两个 GNU 依赖项:

  1. -i许多版本都支持该选项sed,但需要备份文件扩展名的参数(这是一个好主意,因为您可以通过批量就地编辑轻松搞乱系统)。因此将其替换为-i.bak.
  2. 您可以\n在替换中使用,它在 GNU 中被视为换行符,但在大多数版本中sed被视为字符。正确的方法是使用前面带有黑斜杠的实际换行符。nsed

请允许我对您的脚本提供更多提示:

  • 您可以使用以下命令,而不是在替换中重复整个匹配模式&

    sed 's/long pattern/& added after the match/'
    
  • 为什么要留下单引号并执行'\\n'而不是留在引号中并直接写入\n

  • 无需通过将匹配行本身与新行一起替换来添加行,只需使用a以下的 pend 命令sed

    sed '/the line after which to append/a\
    the new line'
    
  • 在新行与给定行几乎相同的特殊情况下,可以通过打印该行并修改它来避免拼写错误:

    sed -i.bak '\|"-var-file=${get_parent_terragrunt_dir()}/variables/eu-west-2.tfvars"|{p;s/west-2/&-prod/;}'
    

相关内容