将两个标记之间的每个文本块写入带有sed的文件

时间:2017-10-04 10:06:33

标签: bash shell sed

我想将STARTEND标记之间的每个文本块提取到单独的文件中。 Sed将是首选工具,但grep和awk也可以。

给出以下文件内容:

abc
START
  def
END
ghi
START
  jkl
END
mno

sed应分别使用以下内容创建两个文件:

START
  def
END

START
  jkl
END

我知道如何使用sed:

获取两个正则表达式之间的内容
sed -n '/START/,/END/p'

在提供e标志时,还有这个选项可以在sed中执行shell命令。这可以用于此任务吗?

3 个答案:

答案 0 :(得分:2)

这可能适合你(GNU sed):

sed '/START/,/END/!d' file | csplit -z - '/END/1' '{*}'

使用sed收集开始和结束分隔符之间的所有行,然后应用csplit为每组行创建单独的文件。

答案 1 :(得分:1)

要保存在这里:

awk '/END/{flag="";print > i"_file";close(i"_file");next} /START/{flag=1;print > ++i"_file";next} flag{print > i"_file"}'  Input_file

输出它将创建2个名为1_file和2_file的文件,其中包含以下内容。

cat 1_file
START
  def
END

cat 2_file
START
  jkl
END

现在也添加非单线形式的解决方案。

awk '
/END/{
  flag="";
  print > i"_file";
  close(i"_file");
  next
}
/START/{
  flag=1;
  print > ++i"_file";
  next
}
flag{
  print > i"_file"
}
'   Input_file

答案 2 :(得分:1)

非常有趣的csplit

谢谢potong

所以没有sed

csplit -z --suppress-matched infile %START%-1 /END/1 {*}

-m = --suppress-matched不起作用。

manpage fr tell -m但是错了。