LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Programming (https://www.linuxquestions.org/questions/programming-9/)
-   -   bash: append string to end of line (https://www.linuxquestions.org/questions/programming-9/bash-append-string-to-end-of-line-532594/)

khairil 02-26-2007 11:43 AM

bash: append string to end of line
 
i'm writing a patch script which including to append 'reboot=b' to grub kernel parameter to my linux box (many of them)

here's what i wrote;
Code:

#!/bin/bash
...
# append reboot=b to kernel parameter - 2007-02-26
kernel=`sed -n '/^kernel/p' /boot/grub/menu.lst | sed q` #get only the first kernel title
kernelappended="$kernel reboot=b"
if [ x$(echo $kernel | grep reboot=b) = "x" ]; then
        #cp --parents /boot/grub/menu.lst $backupdir # ignore this line
        sed "s/$kernel/$kernelappended" /boot/grub/menu.lst
fi
...

example;
the original: kernel /kernel-2.6.19-gentoo-r5 root=/dev/hda3 video=vesafb:ywrap,mtrr,800x600-16@60 splash=silent,fadein,theme:walpurgisnacht quiet CONSOLE=/dev/tty1

will become: the original: kernel /kernel-2.6.19-gentoo-r5 root=/dev/hda3 video=vesafb:ywrap,mtrr,800x600-16@60 splash=silent,fadein,theme:walpurgisnacht quiet CONSOLE=/dev/tty1 reboot=b

however the substitute sed command (sed "s/$kernel/$kernelappended" /boot/grub/menu.lst) failed..
please help me..

tq

macemoneta 02-26-2007 12:17 PM

Substitute the strings manually in the sed command, and you will see what's happening:

Code:

sed "s/kernel /kernel-2.6.19-gentoo-r5 root=/dev/hda3 video=vesafb:ywrap,mtrr,800x600-16@60...
You've got a few extra '/' in there. You need to use a delimiter that won't appear in the string, or escape each occurrence of the delimiter in the string.

nx5000 02-26-2007 12:22 PM

Code:

sed "s/$kernel/$kernelappended" /boot/grub/menu.lst
My awfull way of doing it:
Code:

export xkernel=$kernel
export xkernelappended=$xkernelappended
sed -e `echo "s/$xkernel/$xkernelappended/"` /boot/grub/menu.lst
export xkernel=
export xkernelappended=

edit:
yeah, true for what macemoneta says.

nx5000 02-26-2007 12:26 PM

Less horrible: :D

Code:

sed -e "s/"$kernel"/"$kernelappended"/" /boot/grub/menu.lst

nx5000 02-26-2007 12:40 PM

So to integrate previous comments, you would have to replace / by \/ before doing the sed
Code:

kernel=${kernel//\//\\/}
kernelappended=${kernelappended//\//\\/}
sed -e "s/"$kernel"/"$kernelappended"/" /boot/grub/menu.lst

or in one go

Code:

sed -e "s/"${kernel//\//\\/}"/"${kernelappended//\//\\/}"/" /boot/grub/menu.lst
Hum not really readable anymore..

jr1 02-26-2007 02:57 PM

Quote:

Originally Posted by nx5000
Code:

sed -e "s/"${kernel//\//\\/}"/"${kernelappended//\//\\/}"/" /boot/grub/menu.lst
Hum not really readable anymore..

You can increase readability by using a delimiter that's not in either string. Like this
Code:

sed "s:/foo:/bar:"    # readable
sed "s/\/foo/\/bar/"  # not so readable

Since the strings in your example probably have colons (":") in them, you'll want a different delimiter. Maybe "^",
Code:

sed "s^$kernel^$kernelappended^" /boot/grub/menu.lst

khairil 02-27-2007 05:09 AM

thx to all, i didn't know that i can replace any character as delimiter for sed.. kewl!


All times are GMT -5. The time now is 08:40 PM.