Bash 如何将类定义输出到唯一的文本文件中?

Bash 如何将类定义输出到唯一的文本文件中?,bash,awk,sed,Bash,Awk,Sed,我有一个头文件,其中包含几个类声明,所有声明都以BusType开头…我如何解析每个类并将其输出到它自己的文本文件中 class BusTypeA { struct DummyA { //etc }; //etc }; class BusTypeB { struct DummyB { //etc }; //etc }; class BusType1 { struct Dummy1 {

我有一个头文件,其中包含几个类声明,所有声明都以BusType开头…我如何解析每个类并将其输出到它自己的文本文件中

class BusTypeA
{
    struct DummyA
    {
        //etc
    };
    //etc
};

class BusTypeB
{
    struct DummyB
    {
        //etc
    };
    //etc
};

class BusType1
{
    struct Dummy1
    {
        //etc
    };
    //etc
};

//many more classes...
也许对文件进行第一次传递,将所有bustype收集到变量中,然后在for循环中执行类似的操作

sed -n '/class BusTypeA/,/class BusTypeB/ p' >> BusTypeA.txt
sed -n '/class BusTypeB/,/class BusType1/ p' >> BusTypeB.txt
...
你可以试试这个awk:

正如@hek2mgl在评论中所建议的

awk '/^class/{f=$2;p=1} p&&/^};/{print>>f;close(f);p=0} p{print>>f;close(f);}'
你可以试试这个awk:

正如@hek2mgl在评论中所建议的

awk '/^class/{f=$2;p=1} p&&/^};/{print>>f;close(f);p=0} p{print>>f;close(f);}'
请尝试csplit:

它是内容分割实用程序。您定义了regexp模式,并且应该进行的拆分数量-{*}表示不受限制

请尝试csplit:

它是内容分割实用程序。您定义了regexp模式,并且应该进行的分割的数量-{*}意味着不受限制的

另一个awk

取决于分隔类定义的空行。将awk设置为段落模式,将当前记录打印到以第二个字段加后缀命名的文件中。

另一个awk


取决于分隔类定义的空行。将awk设置为段落模式,将当前记录打印到以第二个字段加后缀命名的文件。

只是一个旁注,我认为在这种情况下这不是问题:当您写入动态生成的文件名(如f)时,awk将打开一个文件描述符,但在程序结束之前不会关闭它。这可能导致文件描述符用完的情况。为了避免这种情况,您需要显式调用closef。您的意思可能是>,而不是>>。Awk不是shell,这些操作的语义是不同的。你不应该有一个壁橱;但是,在最后一次打印之后,它应该正好在f=$2之前,或者在第一次打印之后。您还应该将p操作与/^};/避免重复指定打印两次的操作。例如:awk'/^class/{f=$2;p=1}p{print>f}/^}/{closef;p=0}'当然,您实际上不需要一个名为p的单独标志变量,它可以是:awk'/^class/{f=$2}f{print>f}/^/{closef;f=}这只是一个旁注,我认为在这种情况下这不是一个问题:当您写入动态生成的文件名(如本例中的f)时,awk将打开一个文件描述符,但直到程序结束它才会关闭。这可能导致文件描述符用完的情况。为了避免这种情况,您需要显式调用closef。您的意思可能是>,而不是>>。Awk不是shell,这些操作的语义是不同的。你不应该有一个壁橱;但是,在最后一次打印之后,它应该正好在f=$2之前,或者在第一次打印之后。您还应该将p操作与/^};/避免重复指定打印两次的操作。例如:awk'/^class/{f=$2;p=1}p{print>f}/^}/{closef;p=0}'当然,您实际上不需要一个名为p的单独标志变量,它可以是:awk'/^class/{f=$2}f{print>f}/^/{closef;f=}我希望有一种方法来标记最喜欢的答案,这样下次当我真的需要这个csplit并且记不起它的名字时,我可以在favorites中查找它,而不是在Google中进行语义狂欢。我希望有一种方法来标记最喜欢的答案,这样下次我真的需要这个csplit并且记不起它的名字时,我可以在favorites中查找它谷歌的语义狂欢。
csplit input.txt '/^class BusType.*/' {*}
$ awk -v RS= '{print > $2".txt"}' file