将两个模式之间的行打印到新文件

时间:2013-10-21 07:20:09

标签: regex perl unix sed

请帮我解决这个问题。我有以下模式的文件

ABC x  
bla bla bla  
bla bla  
bla  
XYZ  
ABC y   
bla bla bla  
bla bla  
bla bla bla  
XYZ  

ABC z  
bla bla bla
XYZ

我需要输出文件x.txt

ABC x  
bla bla bla  
bla bla  
bla    
XYZ  

ABC y   
bla bla bla  
bla bla  
bla bla bla  
XYZ 

在y.txt中等等其他模式

5 个答案:

答案 0 :(得分:2)

有些人喜欢这样:

awk '/ABC/ {close(f".txt");f=$2} {print >f".txt"}' file

此测试是否行以ABC开头,然后将输出文件名设置为$2

中的值

EKS

cat y.txt
ABC y
bla bla bla
bla bla
bla bla bla
XYZ

编辑:将close()添加到awk以关闭打开的文件,以便在创建多个文件时不会耗尽空间

答案 1 :(得分:0)

好吧,把所有的输入放到一个数组中,然后用Regex遍历它,直到你找到ABC的东西,打开something.txt作为输出,继续通过你的数组打印输出行直到你找到XYZ并继续前进。

我假设您知道如何编写Perl。

答案 2 :(得分:0)

怎么样:

my $fh;
open my $fh_in, '<', "input_file" or die "unable to open 'input_file: $!";
while (<$fh_in>) {
    chomp;
    if (/^ABC \w+/../XYZ/) {
        if (/^ABC (\w+)/) {
            open $fh, '>', "$1.txt" or die "unable to open '$1.txt': $!";
        }
        print $fh $_,"\n";
    }
}

答案 3 :(得分:0)

您可以使用sed执行此操作,如下所示:

sed -n '/ABC x/,/XYZ/p' file > x.txt

如果您了解所有模式,则可以使用循环:

for i in x y z
do
   sed -n "/ABC $i/,/XYZ/p" file > "$i".txt
done

答案 4 :(得分:0)

awk '/ABC/{name="file "$2".txt";}{print >name}' your_file