Добавьте две последовательные строки в sed - PullRequest
2 голосов
/ 26 февраля 2012

Я хотел бы добавить две строки после поиска первой строки. Я использую:

$ cat file1
HAI
BYE
HAI
ONE
TWO

$ VAR=`cat -n file1 |grep -w HAI |head -1 |awk '{print $1}'`
$ sed "$VAR a\
LINE ONE \
LINE TWO
" file1

Это дает следующий вывод.

HAI
LINE ONE LINE TWO
BYE
HAI
ONE
TWO

Но я хочу, чтобы результат был:

HAI
LINE ONE 
LINE TWO
BYE
HAI
ONE
TWO

Как мне этого добиться? Я пытался сохранить \ n, но он дает ошибки.

Ответы [ 3 ]

4 голосов
/ 26 февраля 2012

Замените вашу команду sed следующим:

sed $VAR' a\
LINE ONE\
LINE TWO
' file1

кстати, ваш прежний grep, awk также может быть уменьшен до:

VAR=$(awk '$1 == "HAI" && NR==1{print NR}' file1)

Намного лучше - получить полный ответ в одной команде awk, например:

awk '{if ($1=="HAI" && done!=1) {done=1; printf("%s\nLINE ONE\nLINE TWO\n", $0);} \
      else print $0}' file1

ВЫВОД:

HAI
LINE ONE
LINE TWO
BYE
HAI
ONE
TWO
2 голосов
/ 26 февраля 2012
$ sed '/HAI/{s/.*/&\nLINE ONE\nLINE TWO/;:a;n;ba}' file1
HAI
LINE ONE
LINE TWO
BYE
HAI
ONE
TWO

Объяснение:

  • /HAI/ поиск по этому шаблону
  • s/.*/&\nLINE ONE\nLINE TWO/ добавить две строки
  • :a определить метку (a)
  • n прочитать следующую строку
  • ba перейти к метке (a)

Вы можете использовать команду a вместо s:

$ sed '
> /HAI/{
> a\
> LINE ONE\
> LINE TWO
> :a
> n
> ba
> }' file1
0 голосов
/ 26 февраля 2012

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

sed '0,/HAI/a\LINE ONE\nLINE TWO' file

или это (любой сед):

sed 'x;/./{x;b};x;/HAI/!b;h;a\LINE ONE\nLINE TWO' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...