sedを使用してテキストを置き換えることはできません

sedを使用してテキストを置き換えることはできません

私はスクリプトを書いていますが、その中にはファイルのいくつかのパラメータを置き換える作業が含まれています。

パラメータを見つけて変更しようとしていますが、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"再引用しますが、セミコロンは引用しないので、シェルはそれをコマンドを終了すると解釈します。

関連情報