「sed」を使用して文字列の「=」記号の後に値を追加するにはどうすればよいですか?

「sed」を使用して文字列の「=」記号の後に値を追加するにはどうすればよいですか?

背景

/etc/default/hostapd次の文字列を取得し、その後に値を追加したいと思います=

#DAEMON_CONF=""->DAEMON_CONF="/etc/hostapd/hostapd.conf"

テスト

un_comment_and_add_value() {
       file="$1"
       given_str="$2" ##DAEMON_CONF=""
       value="$3" # /etc/hostapd/hostapd.conf
                  #dont know where to put this in the 'sed' cmd

       sed -i "/$given_str/s/^#//g" "$file"
}

un_comment_and_add_value "/etc/default/hostapd" "#DAEMON_CONF=\"\"" "/etc/default/hostapd"

答え1

与えられた例では、以下を試してください。

sed -i "/^$given_str/{s/.//; s|.$|$value\"|}" "$file"
  • 変数の補間を許可するには、二重引用符を使用してください。
  • /^$given_str/与えられた文字列が行の先頭に一致する場合
    • s/.//最初の文字を削除
    • s|.$|$value\"|最後の文字を与えられた代替文字列と二重引用符で置き換えます。

追加資料:

答え2

$ cat input
#DAEMON_CONF=""
$ key=DAEMON_CONF
$ value="/etc/hostapd/hostapd.conf"

$ sed "/^$key/ { s/^#//; s%=.*%=\"$value\"%; }" input
DAEMON_CONF="/etc/hostapd/hostapd.conf"

ここには2つあります。まず、シェル変数を拡張するには、一重引用符ではなく二重引用符で囲む必要があります。次に、パターンマッチングに依存するように代替項目をグループ化する必要があります。 (または各パターンの前に一致するパターンをコピーしますs///。) 3番目の、代替項目にスラッシュが含まれているので、sここではパーセント記号などの他の文字を区切り文字として使用することをお勧めします。

変数にパーセント記号が含まれていないことを確認する必要がありますvalue。 sedコマンドにリテラルまたはバックスラッシュを挿入する必要がある場合は、$シェルがバックスラッシュ内で処理されるため、エスケープする必要があります。

もしそうなら、次の点も考慮することができます。 「sed」置換に挿入された文字列がすべてのメタ文字をエスケープするかどうかを確認する方法

答え3

以下のsedコマンドでこれを行いました。質問があれば教えてください。

取得した入力ファイルは次のとおりです。

猫/etc/基本/hostapd

#DAEMON_CONF=""

注文する:

sed -i '/#DAEMON_CONF/s/^#//g' /etc/default/hostapd ; sed -i 's/"/&\/etc\/hostapd\/hostapd.conf/1' /etc/default/hostapd 

出力

DAEMON_CONF="/etc/hostapd/hostapd.conf"

答え4

次のように使用できます。

sed -i /etc/default/hostapd -e '/^#DAEMON_CONF=/s;^#\([^=]*\)=.*;\1='"${VALUE}"';'

  • -iその場でファイルを編集
  • /etc/default/hostapd編集するファイル
  • /^#DAEMON_CONF=/フィルタラインは次から始まります。#DAEMON_CONF=
  • s;変える
  • ^#\([^=]*\)=.*;行全体を置き換えますが、変数名の間にある文字列、#つまりまで覚えておいてください=。この場合、DAEMON_CONF
  • \1=${VALUE}ラインを次に交換します。${remembered variable name}=${VALUE}

関連情報