首先,感谢我们拥有的这样一个美好的社区!我一直受益于stackoverflow上分享的丰富知识。
遇到我面临的问题:
我有一堆文件(大约200个)在这些文件中我想搜索一个模式(多行),如果模式匹配,我想在模式的上方和下方添加一些文本。
E.g
File1.cpp
#ifndef FILE1_H
#define FILE1_H
#ifndef PARENT1_H
#include "Parent1.h"
#endif
#ifndef SIBLING_H
#include "Sibling.h"
#endif
#ifndef PARENT2_H
#include "Parent2.h"
#endif
class File1
{
};
#endif
在此文件中,我想在#ifndef NOPARENT
下方的#ifndef PARENT1_H
和#endif
上方添加#endif
,Parent1.h
位于#ifndef PARENT2_H
下方。
我想对#ifndef FILE1_H
#define FILE1_H
#ifndef NOPARENT
#ifndef PARENT1_H
#include "Parent1.h"
#endif
#endif
#ifndef SIBLING_H
#include "Sibling.h"
#endif
#ifndef NOPARENT
#ifndef PARENT2_H
#include "Parent2.h"
#endif
#endif
class File1
{
};
#endif
所以输出看起来像:
PARENT1_H
我有这样的比赛清单。例如,我在这里搜索PARENT1_H,PARENT2_H等,但我更喜欢GRANDPARENT1_H,GREATGRANDPARENT_H等
基本上,我想的方法是,在这些文件中搜索输入符号(#ifndef NOPARENT
等),如果找到匹配项,请在上面添加文本(#endif
)和{{ 1}}下面。
输入符号很多,要替换的文件也是如此。
任何人都可以帮助我使用sed / awk / perl执行此操作的脚本。或者任何其他语言/脚本(bash等)也会很棒!
我是sed / awk / perl的新手,所以可以使用帮助
非常感谢: - )
最诚挚的问候, 马克
答案 0 :(得分:1)
$ awk '/#ifndef (PARENT1_H|PARENT2_H)$/{print "#ifndef NOPARENT"; f=1} {print} f&&/#endif/{print; f=0}' file
#ifndef FILE1_H
#define FILE1_H
#ifndef NOPARENT
#ifndef PARENT1_H
#include "Parent1.h"
#endif
#endif
#ifndef SIBLING_H
#include "Sibling.h"
#endif
#ifndef NOPARENT
#ifndef PARENT2_H
#include "Parent2.h"
#endif
#endif
class File1
{
};
#endif
答案 1 :(得分:0)
使用正则表达式怎么样?如果这不是您想要的,请告诉我,我会修改!
#!/usr/bin/perl -w
use strict;
my $file = 'file1.txt';
open my $input, '<', $file or die "Can't read $file: $!";
my $outfile = 'output.txt';
open my $output, '>', $outfile or die "Can't write to $outfile: $!";
while(<$input>){
chomp;
my (@match) = ($_ =~ /\.*?(\s+PARENT\d+_H)/); # edit - only matches 'PARENT' not 'GRANDPARENT'
if (@match){
print $output "#ifndef NOPARENT\n";
print $output "$_\n";
print $output "#endif\n";
}
else {print $output "$_\n"}
}
输出:
#ifndef FILE1_H
#define FILE1_H
#ifndef NOPARENT
#ifndef PARENT1_H
#endif
#include "Parent1.h"
#endif
#ifndef SIBLING_H
#include "Sibling.h"
#endif
#ifndef NOPARENT
#ifndef PARENT2_H
#endif
#include "Parent2.h"
#endif
答案 2 :(得分:0)
awk '/PARENT1_H/ {print "#ifndef NOPARENT" RS $0;f=1} /#endif/ && f {print $0;f=0} !/PARENT1_H/' file