Скопируйте раздел в новый файл - PullRequest
3 голосов
/ 03 августа 2010

У меня есть текстовый файл,

!--- Marker one --!
aaaa
bbbb
cccc
dddd
!--- Marker two --!
eeee
ffff
!--- Marker three --!
gggg
hhhh
iiii


И мне нужно скопировать из второго маркера (до конца второго маркера) в новый файл, используя Bash,

!--- Marker two --!
eeee
ffff

Становится отдельным файлом.

Ответы [ 2 ]

8 голосов
/ 03 августа 2010

AWK

$ awk '/Marker two/{f=1;print;next}f&&/Marker/{exit}f' file
!--- Marker two --!
eeee
ffff

Баш

#!/bin/bash

flag=0
while read -r line
do
  case "$line" in
     *"Marker two"*)
         flag=1; echo $line;continue
  esac
  case "$flag $line" in
   "1 "*"Marker"* ) exit;;
   "1"* ) echo $line;;
  esac
done <"file"

сед

$ sed  -n '/Marker two/,/Marker three/{/Marker three/!p}' file
!--- Marker two --!
eeee
ffff
1 голос
/ 03 августа 2010

Классический случай того, что вы можете сделать с помощью 'sed':

sed -n '/^!--- Marker two --!/,/^!--- Marker three --!/{
        /^!--- Marker three --!/d;p;}' \
    infile > outfile

Единственная ошибка, если первый маркер появляется в данных более одного раза.Шаблоны соответствуют началу раздела и началу следующего раздела;команды в фигурных скобках удаляют строку для начала второго раздела и печатают все остальные строки.

Вы также можете обработать несколько таких шаблонов для разделения файлов с помощью команды 'w' (слегка отличающаяся схема соответствия- но может быть адаптирован к приведенному выше, если это необходимо):

sed -n -e '/!--- Marker one --!/,/!--- Marker two --!/w file1' \
       -e '/!--- Marker three --!/,/!--- Marker four --!/w file2' infile

И т. д.

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