使用sed在两个字符串之间提取,直到第一次出现

使用sed在两个字符串之间提取,直到第一次出现,sed,Sed,有人能解释为什么我在使用同一个命令时得到不同的结果吗?我有2个C++文件: 第一个(最大高度) 第二个(ax.cpp) 为什么在我使用命令时会出现这种情况: sed -n '/iseven/,/}/p' ax.cpp 我的输出只执行我想要的操作,它在iseven和第一次出现的}->之间打印文本 int iseven(int a) { if (a%2==0){ return 1; else return 0;} 但是,当我在第一个文件(ax.h)上使

有人能解释为什么我在使用同一个命令时得到不同的结果吗?我有2个C++文件:

  • 第一个(最大高度)
  • 第二个(ax.cpp)
  • 为什么在我使用命令时会出现这种情况:

    sed -n '/iseven/,/}/p' ax.cpp
    
    我的输出只执行我想要的操作,它在
    iseven
    和第一次出现的
    }
    ->之间打印文本

    int iseven(int a) {
        if (a%2==0){
           return 1;
        else
           return 0;}
    
    但是,当我在第一个文件(ax.h)上使用相同的命令(
    sed-n'/iseven/,/)/p'ax.h
    )时,它会打印出所有内容:

    int iseven(int a);
    int sum(float a, int b);
    
    我所期望的是
    intiseven(inta)

    当您使用
    /start/,/end/
    作为
    sed
    命令中的地址,它在匹配
    start
    后开始搜索下一行的
    end
    。因此,当结束模式与开始模式位于同一行时,不能使用模式范围


    您可以只使用
    /iseven/p
    来匹配
    ax.h
    中的那些行,除非您需要允许声明分布在多行上。如果您需要同时处理单行和多行声明,可能有一种方法可以使用保留空间,但我不是一个足够高级的
    sed
    用户,无法演示如何执行该操作。

    哦,好吧,但我该如何修复它?为什么要使用范围?只使用<代码> /ISFIN/P</代码>我的原始代码实际上是检查目录中的C++程序的数量,因此,不是一个文件,而是一个文件数组,在这种情况下它不起作用,所以我只是用它作为一个例子,我的意思是,它可能在同一行,可能不是。因此,让它们都工作对我来说很重要。但是对于
    .cpp
    h
    文件,您有不同的sed命令。一个搜索
    }
    ,另一个搜索
    。这有区别吗?在.h文件中,我正在搜索函数实现,因此,即使在第一个闭括号之前,我也会根据您对Barmar的评论,建议使用两个文件中可能出现的不同格式的更多示例(例如,额外的行、嵌套的括号/大括号等)更新问题;所有文件名是否都以
    .h
    .cpp
    结尾?对于
    .h
    文件,您是否总是在查找结尾右括号和分号(
    +
    -可能中间有空格?对于
    .cpp
    文件,您是否总是在寻找右大括号(
    }
    )结尾?您计划搜索多少文件(在您提到的一个文件名数组的评论中)?请同时提供您将要搜索的文件的详细信息。。。所有文件中都有一个函数名?所有文件中的函数列表?还有别的吗?我的想法是从更大的角度来看…在阅读了Barmar的所有评论之后,我发现多个括号可能会造成麻烦,幸运的是我没有这个问题,因为我必须排序的所有文件都没有多个括号,我的任务是找到函数在目录中的位置,因此,
    /script.sh项目是一个甚至
    的项目,然后我得到了所有的文件,我已经找到了所有这些文件,路径,文件。。基本上他所建议的解决了我的问题,但我还是想知道如何使它变得更好
    int iseven(int a) {
        if (a%2==0){
           return 1;
        else
           return 0;}
    
    int iseven(int a);
    int sum(float a, int b);