вставить вывод sed в другой файл между шаблонами - PullRequest
0 голосов
/ 23 мая 2018

Мне нужно заменить некоторое содержимое из одного файла1 в файл2 внутри одного файла шаблона1

/* start */
    abc
/* end */

file2

/* start */
    xyz
/* end */

результат должен быть в файле2

/* start */
    abc
/* end */

то, что я сделал для достижения этой цели, приведено ниже:

sed -n "/start/,/end/p" file1 >> sed -i 's/start.*end/start  end/g' file2

Но вышеупомянутое добавляется в file2.Пожалуйста, руководство

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Вы хотите строки от file2 до /start/, затем строки из file1 между маркерами и, наконец, результирующие строки из файла 2.
Если вы игнорируете границы, это будет

(
   sed -n "1,/start/p" file2
   sed -n "/start/,/end/p" file1
   sed -n "/end/,$ p" file2
) > /tmp/outputfile

Граничные проблемы - это двойные теги start / stop, и что произойдет, когда file2 начинается с /start/ или заканчивается /end/.
Вы можете исправить граничные проблемы с

(
   sed "/start/,$ d" file2
   sed -n "/start/,/end/p" file1
   sed "1,/end/ d" file2
) > /tmp/outputfile
0 голосов
/ 24 мая 2018

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

sed -n '/start/,/end/p' file1 |
sed -e '/start/,/end/{/end/r /dev/stdin' -e 'd}' file2

Передать вывод между start и end первого файла на стандартный вывод.Удалите все строки между start и end во втором файле, заменив их содержимым стандартного ввода при обнаружении end.

0 голосов
/ 23 мая 2018

Если вы хотите изменить строки между началом строки и концом строки с Input_file1 до Input_file2, то следующее может помочь вам в этом.

awk '
FNR==NR{
  if($0 ~ /^\/\* start \*\//){
     flag=1;
     next};
  if($0 ~ /\/\* end \*\//){
     flag=""};
  if(flag){
     val=val?val ORS $0:$0};
  next
}
/^\/\* start \*\//{
  flag2=1;
  print;
  next}
/\/\* end \*\//{
  flag2=""}
flag2{
  $0=val;
  flag2=""
}
1'  Input_file1  Input_file2

Если вы хотите сохранить выходные данные в самом Input_file2, добавьте > temp_file && mv temp_file Input_file2 в последнюю строку кода выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...