我有一个文本文件,
!--- Marker one --!
aaaa
bbbb
cccc
dddd
!--- Marker two --!
eeee
ffff
!--- Marker three --!
gggg
hhhh
iiii
我需要使用Bash将标记2(直到标记2的结尾)复制到新文件中。
!--- Marker two --!
eeee
ffff
成为一个单独的文件。
答案 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
等