как преобразовать сценарий bash в C ++ с помощью boost :: iostreams

Я пытаюсь преобразовать следующий код bash в C ++ с помощью boost :: iostreams:

#!/usr/bin/bash
(
    gzip -cd file1.ext.gz
    cat file2.ext
) | grep '^regex' # or sed 's/search/replace/'

Я могу открыть файл и распакуйте его:

std::ifstream s("file.ext.gz", std::ios_base::in | std::ios_base::binary);
boost::iostreams::filtering_istreambuf in;
in.push(boost::iostreams::gzip_decompressor());
in.push(s);

Затем откройте несжатый файл:

std::ifstream s2("file.ext", std::ios_base::in | std::ios_base::binary);

Теперь я немного застрял, поэтому вот мои вопросы:

1) Какое решение boost :: iostreams для объединения двух потоков?

2) Как вывести результат через фильтр регулярных выражений для эмуляции grep / sed?

В результате я хотел бы иметь поток istream, который я мог бы скопировать в cout:

boost::iostream::copy(result, std::cout);

ОБНОВЛЕНИЕ полное решение с использованием конкатенации Хамигаки :

/*
 * convert the following bash script into C++
 *
 * #!/bin/bash
 * (
 *     gzip -cd file1.ext.gz
 *     cat file2.ext
 * ) | grep '^filter' | 'sed s/search/replace/g'
 *
 */

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

// http://hamigaki.sourceforge.jp/hamigaki/iostreams/concatenate.hpp
#include "concatenate.hpp"

namespace io = boost::iostreams;

int main(int argc, char const* argv[])
{
    io::file_source file1("file1.ext.gz");
    io::file_source file2("file2.ext");
    io::gzip_decompressor gzip;
    io::regex_filter sed(boost::regex("search"), "replace");
    io::grep_filter grep(boost::regex("^filter"));

    io::filtering_istreambuf in1(gzip | file1);
    io::filtering_istreambuf in2(file2);

    io::filtering_istreambuf combined(sed | grep | 
            hamigaki::iostreams::concatenate(
                boost::ref(in1),
                boost::ref(in2)
            )
        );

    io::copy(combined, std::cout);

    return 0;
}

9
задан chris 23 February 2011 в 19:05
поделиться