sed는 특정 줄 뒤에 텍스트를 배치합니다.

sed는 특정 줄 뒤에 텍스트를 배치합니다.

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

관련 정보