Sedはスペースと二重引用符を含む文字列を置き換えます。

Sedはスペースと二重引用符を含む文字列を置き換えます。

/boot/grub/grub.cfggrubが更新されるたびに、grub構成ファイル()の1行を変更するためにスクリプトでsedを使用しようとしています。次の行を変更したい。

menuentry "Kali GNU/Linux"

これで:

'menuentry "Kali GNU/Linux" --class kali'

/boot/grub/grub.cfgの行は次のとおりです。

menuentry "Kali GNU/Linux" --class gnu-linux --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-5.14.0-kali2-amd64--7afb9c25-9d47-4ce4-a3dd-635aa0b04d7a'

基本的に私が望むのは行を追加することです--class kalignu-linuxoroskaliその単語が複数回出現するためです。

私が使用するスクリプトは次のとおりです。

TARGET_STRING='menuentry "Kali GNU/Linux"'
NEW_STRING='menuentry "Kali GNU/Linux" --class kali'
sudo sed -i "s/$TARGET_STRING/$NEW_STRING/g" /boot/grub/grub.cfg

これは機能しないため、次のエラーが発生します。

sed: -e expression #1, char 32: unknown option to `s'

スペースを含む文字列を置き換えるソリューションをオンラインで見つけました。ここ二重引用符を含む文字列を置き換えます。ここただし、文字列に両方が含まれている場合はそうではありません。

誰でも私を助けることができますか?

注:私はGNU sed 4.7

答え1

変数は必要ありません。文字列を直接使用してください。

sudo sed -i 's|menuentry "Kali GNU/Linux"|menuentry "Kali GNU/Linux" --class kali|' /boot/grub/grub.cfg

文字列が含まれていて/演算子が/区切り文字として使用しているため、エラーが発生しますs///。しかし、どんな文字でも使用できるので、s|||上でこれを使用しました。通常、選択した文字がまたは$target_stringに存在しないことを確認する必要があります$new_string。この例ではこれが本当ですが|、他の場合は別のものを選択する必要があるかもしれません。

あなたできる本当に変数を使用したい場合はあまり役に立ちません。また、通常、シェルスクリプトでは大文字の変数名を使用しないことをお勧めします。しかしこれはうまくいきます:

target_string='menuentry "Kali GNU/Linux"'
new_string='menuentry "Kali GNU/Linux" --class kali'
sudo sed -i "s|$target_string|$new_string|" /boot/grub/grub.cfg

関連情報