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
* BSDなどの非GNUシステムを使用している可能性があり、作成した方法がほとんどsed
のsed
バージョンで実行されない可能性があります。そのため、GNUをsed
インストールしgsed
たり、適切にスクリプトを変更したりできますsed
。 2つのGNU依存関係を見ることができます。
-i
多くのバージョンがこのオプションをサポートしていsed
ますが、ファイル拡張子のパラメータをバックアップする必要があります(一括内部編集でシステムを簡単に台無しにすることができるので良い考えです)。したがって-i.bak
。- GNUでは改行文字として扱われますが、ほとんどのバージョンでは文字として扱われる
\n
置換に使用できます。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/;}'