Sed

Sed 替換包含空格和雙引號的字元串

  • November 18, 2021

/boot/grub/grub.cfg每次 grub 更新時,我都嘗試在腳本中使用 sed 來修改我的 grub 配置文件()中的一行。我希望替換以下行:

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 kali. 我無法替換gnu-linuxos替換,kali因為這些詞多次出現。

我使用的腳本如下:

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

不需要變數。直接使用字元串:

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

您收到錯誤是因為您的字元串包含/並且您在運算/符中用作分隔s///符。不過,您可以使用任何字元,這就是我在s|||上面使用的原因。一般來說,您需要確保選擇一個不在$target_string或中的字元$new_string。所以|在這個例子中有效,但你可能需要為其他情況選擇另一個。

如果你真的,真的想要,你*可以使用變數,它們只是在這裡沒有幫助。*此外,作為一般規則,最好避免在 shell 腳本中使用 CAPITAL 變數名。不過,這會起作用:

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

引用自:https://unix.stackexchange.com/questions/677784