Вставка нескольких строк текста перед конкретной строкой с помощью sed

Я пытаюсь вставить несколько строк текста перед определенной строкой, но продолжаю получать ошибки sed, когда я пытаюсь добавить новый символ строки. Моя команда выглядит так:

sed -r -i '/Line to insert after/ i Line one to insert 
    second new line to insert 
    third new line to insert' /etc/directory/somefile.txt

сообщается об ошибке:

sed: -e expression #1, char 77: unterminated `s' command

Я пробовал, используя n, (как в Примере), никакого символа вообще, просто перемещение второй строки в следующую строку. Я также пробовал что-то вроде:

sed -r -i -e '/Line to insert after/ i Line one to insert'
    -e 'second new line to insert'
    -e 'third new line to insert' /etc/directory/somefile.txt

редактировать!: Извините, я хотел, чтобы текст был вставлен перед существуя, а не после!

6 ответов


Это должно работать:

sed -i '/Line to insert after/ i Line one to insert \
second new line to insert \
third new line to insert' file

для чего-либо, кроме простых замен на отдельных линиях, используйте awk вместо sed для простоты, ясности, надежности и т. д., п.

вставить перед строку:

awk '
/Line to insert before/ {
    print "Line one to insert"
    print "second new line to insert"
    print "third new line to insert"
}
{ print }
' /etc/directory/somefile.txt

вставить после строки:

awk '
{ print }
/Line to insert after/ {
    print "Line one to insert"
    print "second new line to insert"
    print "third new line to insert"
}
' /etc/directory/somefile.txt

sed -i '/Line to insert after/ i\
Line one to insert\
second new line to insert\
third new line to insert' /etc/directory/somefile.txt

Это может сработать для вас (GNU sed & Bash):

sed -i $'/Line to insert after/a\line1\nline2\nline3' file

этот ll работает с первой строки.. Например: если вы хотите вставить из 3-й строки файла, замените "1i "на"3i".

sed -i '1i line1'\n'line2'\n'line3' 1.txt 

cat 1.txt

 line1
 line2
 line3
 Hai

чтобы быть совместимым с POSIX и работать в OS X, я использовал следующее (одиночная строка с кавычками и пустая строка для демонстрационных целей):

sed -i "" "/[pattern]/i\
line 1\
line 2\
\'line 3 with single quotes\`
\
" <filename>