使用分隔符分隔Sed文件

时间:2011-12-23 15:44:29

标签: shell sed

我有以下sed命令将文件分成两部分:

sed -n '1,/(-!-)/{/(-!-)/!p}' file.temp file1.txt
sed -n '/(-!-)/,${/(-!-)/!p}' file.temp file2.txt

该文件类似于123( - ! - )321

我得到了这个结果:

文件1: 123

file2的: 321

这个效果很好,但我希望它分成4个文件,这意味着我将使用3个分隔符

有人可以给我一些关于如何做的提示吗?

2 个答案:

答案 0 :(得分:6)

sed可能不适合这项工作。另一方面,awk能够分割任意正则表达式的记录,最终使这很容易。首先,这是从文件中提取特定部分的方法。

鉴于此输入:

this is section 1
(-!-)
this is section 2
(-!-)
this is section 3

我们可以像这样提取第三部分:

awk -vRS='\n[(]-!-[)]\n' 'NR==3 {print}' file.temp

这给了我们:

this is section 3

在此命令中,我们将awk的记录分隔符(RS变量)设置为与文件中的分隔符匹配的正则表达式。通常,awk使用换行符作为记录分隔符,因此每行都是新记录。通过明确地将RS设置为此正则表达式,我们将awk视为单个实体。

您可以将每个部分提取到一个单独的文件中:

awk -vRS='\n[(]-!-[)]\n' -vprefix="file" '{print > prefix NR}' file.temp

这将为您提供文件file1file2file3作为输出,每个文件都包含相应部分的内容。文件名是根据“prefix”变量的值(由-vprefix="file"选项设置)和当前记录号生成的。

答案 1 :(得分:1)

这可能对您有用:

cat <<! >file.temp
> aaa
> (-!-)
> bbb
> (-!-)
> ccc
> (-!-)
> ddd
> !
csplit -n1 -ffile file.temp '/(-!-)/' '{*}'
sed -i '/(-!-)/d' file?