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 依赖项:
-i
许多版本都支持该选项sed
,但需要备份文件扩展名的参数(这是一个好主意,因为您可以通过批量就地编辑轻松搞乱系统)。因此将其替换为-i.bak
.- 您可以
\n
在替换中使用,它在 GNU 中被视为换行符,但在大多数版本中sed
被视为字符。正确的方法是使用前面带有黑斜杠的实际换行符。n
sed
请允许我对您的脚本提供更多提示:
您可以使用以下命令,而不是在替换中重复整个匹配模式
&
: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/;}'