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를 사용하여 삽입된 행 앞에 내용을 추가할 수도 있습니다.