Sed는 공백과 큰따옴표가 포함된 문자열을 바꿉니다.

Sed는 공백과 큰따옴표가 포함된 문자열을 바꿉니다.

/boot/grub/grub.cfggrub이 업데이트될 때마다 grub 구성 파일()의 한 줄을 수정하기 위해 스크립트에서 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 kali. gnu-linuxor oskali해당 단어가 여러 번 나타나기 때문입니다.

내가 사용하는 스크립트는 다음과 같습니다.

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

관련 정보