使用sed在两个字符串之间提取,直到第一次出现
有人能解释为什么我在使用同一个命令时得到不同的结果吗?我有2个C++文件:使用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)上使
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);