私はスクリプトを書いていますが、その中にはファイルのいくつかのパラメータを置き換える作業が含まれています。
パラメータを見つけて変更しようとしていますが、sedをデバッグする必要があります。
sed -i "s/"$DEFAULT_MAIL_DOMAIN = "padl.com";"/"$DEFAULT_MAIL_DOMAIN = "$E_DOMAIN";"/g" /usr/share/migrationtools/migrate_common.ph
ターゲットファイル:
# Default DNS domain
$DEFAULT_MAIL_DOMAIN = "padl.com";
# Default base
$DEFAULT_BASE = "dc=padl,dc=com"
スクリプト:
echo "Enter the email domain"
read E_DOMAIN
echo "The email domain will be "$E_DOMAIN".com"
sleep 2
E_DOMAIN_VAR=$E_DOMAIN.com
sed -i "s/"$DEFAULT_MAIL_DOMAIN = "padl.com";"/"$DEFAULT_MAIL_DOMAIN = "$E_DOMAIN";"/g" /usr/share/migrationtools/migrate_common.ph
答え1
私は次のようなことをお勧めします。
sed -i 's|$DEFAULT_MAIL_DOMAIN = \"padl.com\";|$DEFAULT_MAIL_DOMAIN = \"$E_DOMAIN\";|' /usr/share/migrationtools/migrate_common.ph
私が変更したもの:
- sedに変更し、周囲の一重引用符を置き換えます。すべての二重引用符は間違いなく問題を引き起こす可能性があります。
- sed代替構文がから変更されました
/
。|
この部分は必須ではありません。私はそれが良いです。/
必要に応じて保管できます。 - 次に、検索の周りの二重引用符を削除してテキストを置き換えました。必要ありません。
- ファイルテキストに実際に存在する二重引用符はエスケープされます。
- sed 置換が終了すると、グローバルフラグが削除されました。これは、1行に1回だけ発生する(おそらくファイルごとに1回)設定ファイルのパラメータのように見えます。
答え2
$DEFAULT_MAIL_DOMAIN
引用符がファイルのリテラル部分である場合は、単一引用符またはバックスラッシュを使用してエスケープする必要があります。したがって、次のいずれかの状況に該当します。
$ E_DOMAIN=foobar.com
$ sed -e 's/$DEFAULT_MAIL_DOMAIN = "padl.com"/$DEFAULT_MAIL_DOMAIN = "'"$E_DOMAIN"'"/' file
# Default DNS domain
$DEFAULT_MAIL_DOMAIN = "foobar.com";
...
$ sed -e "s/\$DEFAULT_MAIL_DOMAIN = \"padl.com\"/\$DEFAULT_MAIL_DOMAIN = \"$E_DOMAIN\"/" file
# Default DNS domain
$DEFAULT_MAIL_DOMAIN = "foobar.com";
まず、引用文を次のように説明します。
'.../$DEFAULT_MAIL_DOMAIN = "'"$E_DOMAIN"'"/'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^ - single-quoted, literal ""s
^^^^^^^^^^^ - double-quoted, var expanded
2番目の項目では、内容全体が質問を含む二重引用符で囲まれた文字列であり、$
エスケープ"
されます。しかし、我々はその変数を拡張したいので、$
含めません。$E_DOMAIN
E_DOMAIN
変数が必要かどうかはわかりませんE_DOMAIN_VAR
。.com
後者にサフィックスを追加しましたが、sed
コマンドでは前者を使用しました。いずれにせよ、変数の/
、&
または改行文字は具体的に処理されますが、sed
ドメイン名にはこれらの文字を含めないでください。
コードスニペットから引用が少し外れています。
sed -i "s/"$DEFAULT_MAIL_DOMAIN = "padl.com";"/"$DEFAULT_MAIL_DOMAIN = "$E_DOMAIN";"/g"
最初の部分"s/"
は引用符で囲まれた文字列で、次は$DEFAULT_MAIL_DOMAIN
外側の引用符であるため、変数(おそらく空の文字列)に展開されます。空白も引用されていないため、複数の引数が発生して文句をsed
言う可能性があります。"padl.com"
再引用しますが、セミコロンは引用しないので、シェルはそれをコマンドを終了すると解釈します。