将部分复制到新文件中

时间:2010-08-03 03:38:26

标签: bash sed awk

我有一个文本文件,

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


我需要使用Bash将标记2(直到标记2的结尾)复制到新文件中。

!--- Marker two --!
eeee
ffff

成为一个单独的文件。

2 个答案:

答案 0 :(得分:8)

AWK

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

的bash

#!/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

$ sed  -n '/Marker two/,/Marker three/{/Marker three/!p}' file
!--- Marker two --!
eeee
ffff

答案 1 :(得分:1)

使用'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