Sedのマンページを読んでいますが、まだ混乱しているので、ここで答えを見つけることができることを願っています。 :)
Bashスクリプトを使用してファイルを編集する必要があります。
grub.cfgの特定の行の後に数行を配置する必要があります。例を示すために5つの新しい行を追加します。
オリジナル:
if loadfont /boot/grub/font.pf2 ; then
set gfxmode=auto
insmod efi_gop
insmod efi_uga
insmod gfxterm
terminal_output gfxterm
fi
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
menuentry "Install Ubuntu Server" {
set gfxpayload=keep
linux /install/vmlinuz file=/cdrom/preseed/ubuntu-server.seed quiet ---
initrd /install/initrd.gz
}
menuentry "OEM install (for manufacturers)" {
set gfxpayload=keep
linux /install/vmlinuz file=/cdrom/preseed/ubuntu-server.seed quiet oem-config/enable=true ---
initrd /install/initrd.gz
}
編集後:
if loadfont /boot/grub/font.pf2 ; then
set gfxmode=auto
insmod efi_gop
insmod efi_uga
insmod gfxterm
terminal_output gfxterm
fi
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
newly_addedd_line_1
newly_addedd_line_2
newly_addedd_line_3
newly_addedd_line_4
newly_addedd_line_5
menuentry "Install Ubuntu Server" {
set gfxpayload=keep
linux /install/vmlinuz file=/cdrom/preseed/ubuntu-server.seed quiet ---
initrd /install/initrd.gz
}
menuentry "OEM install (for manufacturers)" {
set gfxpayload=keep
linux /install/vmlinuz file=/cdrom/preseed/ubuntu-server.seed quiet oem-config/enable=true ---
initrd /install/initrd.gz
}
sedを使用するとどのように機能しますか?理想的には、すべての新しい行を新しいスクリプト変数に入れることです。
たとえば、
LINES_TO_ADD='newly_addedd_line_1\n
newly_addedd_line_2\n
newly_addedd_line_3\n
newly_addedd_line_4\n
newly_addedd_line_5'
よろしくお願いします!
答え1
sed '/^set menu_color_highlight/a\
newly_addedd_line_2\
newly_addedd_line_3\
newly_addedd_line_4\
newly_addedd_line_5' /path/to/file
出力を確認したら、sed --in-place
新しいファイルを使用または作成し、古いバージョンを置き換えることができます。
マニュアルから:
[1addr]a\ text Write text to standard output immediately before each attempt to read a line of input, whether by executing the ``N'' function or by beginning a new cycle.
おそらく少し強力です。新しいテキストブロックをファイル(たとえばnewlines
)に入れてから、次のものを使用できます。
sed '^set menu_color_highlight/r newlines' /path/to/input.
また、マニュアルで:
[1addr]r file Copy the contents of file to the standard output immediately before the next attempt to read a line of input. If file cannot be read for any reason, it is silently ignored and no error condition is set.
答え2
LINES_TO_ADD='newly_addedd_line_1
newly_addedd_line_2
newly_addedd_line_3
newly_addedd_line_4
newly_addedd_line_5'
LINES_TO_ADD_ESC=$(printf '%s\n' "$LINES_TO_ADD" | sed 's:[\/&]:\\&:g;$!s/$/\\/')
sed -e "
/^set menu_color_highlight=/G
//s/\$/$LINES_TO_ADD_ESC/
"
答え3
特定の行番号が絶対に変更されない場合は、次のように使用できます。
sed -i '11inewly_addedd_line_1 \
newly_addedd_line_2 \
newly_addedd_line_3 \
newly_addedd_line_4 \
newly_addedd_line_5' /path/to/your/grub.cfg
「-i」フラグを含まないことで、最初に必要な操作を実行していることを再確認できます(このフラグがないと、変更を含むファイルは印刷されますが、実際には変更されません)。
パターンが一致した後に追加し、挿入するパターンに行全体が含まれている場合は、次のことができます。
sed -i '/set menu_color_highlight=black\/light-gray/a \
newly_addedd_line_1 \
newly_addedd_line_2 \
newly_addedd_line_3 \
newly_addedd_line_4 \
newly_addedd_line_5' /path/to/your/grub.cfg
ここで、/PATTERN/a はパターンに追加されることを意味します。
/PATTERN/i を使用して、挿入された行の前にコンテンツを追加することもできます。