
次のように、既存の変数の一部のみを新しいユーザー入力変数に置き換えようとします。
#Current Variable:
gdbName=Test.MY.DOMAIN.COM <--I need to replace the "Test" (This can be any other string not just Test e.g. CDB79 etc.) part only in this variable with new user input variable.
#New user input variable:
read -p "Enter CDB Name : " CDBName
#I tried the following line:
sed -i "s/gdbName=*.MY.DOMAIN.COM/gdbName=$CDBName/" somefile.txt
しかし、これは変数全体を置き換えます。
どんな提案がありますか?
注:ファイルの変数を更新しています。
答え1
いくつかの行を含むファイルを修正したいとしましょう。
gdbName=Test.MY.DOMAIN.COM
まあ、これは以下を使って行うことができます。
sed "s/^\(gdbName\)=Test\./\1=$CDBName./" somefile
または、より一般的でなければならず、文字列を指定しない場合は、ドットを含まないすべての文字列Test
(空の文字列を含む)と一致させることができます。
sed "s/^\(gdbName\)=[^.]*\./\1=$CDBName./" somefile
このコマンドは、行の先頭(最初の点まで)を変数名(文字列)gdbName
、等号、およびシェル変数の値に置き換えますCDBName
。
ユーザー入力には、特殊なバックスラッシュでエンコードされた文字シーケンスまたはが含まれてCDBName
いないと想定されます。&
/
sed
どちらの場合も、シェルスクリプトは名前付き変数を定義する必要はありませんgdbName
。
sed
明示的に一致を要求して交換したため、ドメイン名の末尾の部分を削除しようとしました。
答え2
たとえば、変数を介して新しい名前を動的に設定するには(ここでは永続的な変更のみが表示されます):
試みはほぼ完了しました。
sed -i "s/gdbName=*.MY.DOMAIN.COM/gdbName=$CDBName/" somefile.txt
sed -i "s/gdbName=.*\.MY\.DOMAIN\.COM/gdbName=$CDBName.MY.DOMAIN.COM/" somefile.txt
正規表現のドットはすべての文字と一致しますが、ドット自体が含まれているため、ほとんどの場合、ここでドットをマスクするのは少し過剰です。