1行でドル記号と一致する中括弧を複数回削除します。

1行でドル記号と一致する中括弧を複数回削除します。

ファイルの元の行:

alarm_name = "${var.environment}-${var.deployment}-${var.service_name}-elb-healthyhosts"

${}、、${}なしでこの行が欲しいです${}

alarm_name = "var.environment-var.deployment-var.service_name-elb-healthyhosts"

次のようにsed:最初${と最後を削除します}

sed s'/\${\(.*\)}/\1/' filename

ペアでキャリブレータを削除するには?

答え1

私は使用します

sed -E 's/\$\{([^}]+)\}/\1/g'

デモ:

$ line='alarm_name = "${var.environment}-${var.deployment}-${var.service_name}-elb-healthyhosts"'
$ sed -E 's/\$\{([^}]+)\}/\1/g' <<<"$line"
alarm_name = "var.environment-var.deployment-var.service_name-elb-healthyhosts"

答え2

この入力に必要なものは次のとおりです。

$ tr -d '${}' < file
alarm_name = "var.environment-var.deployment-var.service_name-elb-healthyhosts"

これが必要なすべてではない場合は、より代表的な入力/出力の例を提供するように質問を編集しますが、機能しません。

答え3

問題は、.*初期値と最終値の中間値も一致することです。${}${}

ゼロ個以上の非文字に一致するものに置き換えられていることをs/${\([^}]*\)}/\1/g除いて、現在持っているものとほぼ同じこれを使用できます。最後に重複しないすべての一致に対して置換を繰り返します。.*[^}]*}/g

ただし、これは入れ子になった項目では機能しません${...${...}...}

別の方法:

次の行からすべてと${を削除します。}

sed -e 's/${//g' -e 's/}//g' file

上記のコマンドの利点は、2つの単純な正規表現が通常、1つの複雑な式よりも理解し維持するのが簡単であることです。また、入れ子になった文字列を処理します${}が、入れ子になった文字列を処理する機能が欠けています。ペア ${を使用すると、それがあるかどうかに関係なく、すべてまたは}削除します。${}}${

文字列で始まる行でのみこれを行うには、次のようにしますalarm_name =

sed -e '/^alarm_name =/!b' -e 's/${//g' -e 's/}//g' file

このbコマンドはスクリプトの末尾に分岐し、ここで行が一致しない場合は置換をバイパスするために使用されます^alarm_name =

テスト:

$ cat file
alarm_name1 = "${var.environment}-${var.deployment}-${var.service_name}-elb-healthyhosts"
alarm_name = "${var.environment}-${var.deployment}-${var.service_name}-elb-healthyhosts"
alarm_name2 = "${var.environment}-${var.deployment}-${var.service_name}-elb-healthyhosts"
$ sed  -e '/^alarm_name =/!b' -e 's/${//g' -e 's/}//g' file
alarm_name1 = "${var.environment}-${var.deployment}-${var.service_name}-elb-healthyhosts"
alarm_name = "var.environment-var.deployment-var.service_name-elb-healthyhosts"
alarm_name2 = "${var.environment}-${var.deployment}-${var.service_name}-elb-healthyhosts"

質問にタグ付けしたので、エディタで行う方法は次のとおりですed

g/^alarm_name =/ s/${//g\
s/}//g

つまり、一致するすべての行に対して^alarm_name =2回の交換が行われます。

または、コマンドラインからスクリプト操作へ:

printf '%s\n' 'g/^alarm_name =/ s/${//g\' 's/}//g' ',p' 'Q' |
ed -s file

次に、変更されたファイルの内容は終了前に標準出力に出力されます,p。および/または変更をファイルに書き換えるにはQ使用します。wqwq

関連情報