正则表达式将删除所有内容,除了其中包含特定字符串的任何标签

时间:2018-08-16 18:50:07

标签: regex bash vim awk

我需要一个可用于vim编辑器或bash(grep命令)的正则表达式,它将删除文件中的所有内容,仅保留包含特定字符串的标记:

<generic>
stuff1
stuff2
stuff3
</generic>

<generic>
stuff1
stuff2
DESIRED_STRING
stuff3
</generic>

由于DESIRED_STRING,第一个将被擦除,而第二个将保留。

最后,我需要一个带有大量标签的文件,其中包含修饰符。此过程将执行几次,以将一个大文件分割成多个其他文件。

这个(?<=\<custom_item\>).*?(?=\<\/custom_item\>)使我可以匹配标签内的内容。虽然无法过滤。

文件将始终遵循此结构

<tag>
system      : "Linux"
type        : CHECK
</tag>

“ CHECK”是修饰语,我要查找的单词

谢谢!!

3 个答案:

答案 0 :(得分:3)

您可以通过awk使用此方法:

awk '/<generic>/ { tag=1 }
     tag && /DESIRED_STRING/ { p=1 }
     tag { s = s $0 RS }
     /<\/generic>/ { if (p) printf "%s", s; tag=p=0; s="" }' file

我们使用2个标志在此处跟踪我们的状态。 tag表示当我们在打开和关闭标签内时的状态,p代表当我们在打开/关闭标签内时找到所需的字符串的状态。

答案 1 :(得分:2)

这是Vim中的另一种选择:匹配要比避免匹配容易得多,所以...

Gmz:1,'z g/DESIRED_STRING/norm yat:$pu<Ctrl-V><Enter><Enter>'zdgg

其中<Ctrl-V><Enter>应该是键,而不是要输入的实际文本。

Gmz将在最后一行设置z标记。然后,我们搜索DESIRED_STRING,然后在每个'zdgg上拉标签,然后将其粘贴到文件底部(按顺序)。然后z删除原始文件(从标记outside<tag>inside foo DESIRED_STRING inside</tag>outside 到文件顶部)。

基本上,与其尝试删除所有内容并为所需内容添加例外,不如先拉出所需内容,然后再删除所有内容。

奖金:即使标签与换行符不符(即使OP没有换行符),也可以使用。例如,

<tag>inside
foo DESIRED_STRING inside</tag>

将正确产生

    import { Component } from '@angular/core';
    import { IonicPage, NavController, NavParams } from 'ionic-angular';
    import { SplashScreen } from '@ionic-native/splash-screen';
    import { StatusBar } from '@ionic-native/status-bar';
    import { Injectable } from "@angular/core";
    import { Http } from '@angular/http';
    import { HttpClientModule } from '@angular/common/http';
    import 'rxjs/add/operator/map';
    import { HomePage } from '../home/home';
    /**
     * Generated class for the ListCustomerPage page.
     *
     * See https://ionicframework.com/docs/components/#navigation for more info on
     * Ionic pages and navigation.
     */
    @IonicPage()
    @Component({
      selector: 'page-list-customer',
      templateUrl: 'list-customer.html',
    })
    export class ListCustomerPage {
      data:any = {};
      items:any = {};
      public res_data: any ='';
      constructor(public navCtrl: NavController, public navParams: NavParams, public http: Http) {
      this.http = http;
      this.res_data= this.navParams.get('res_data');
      }
    ionViewDidLoad() {
    var link='http://localhost/CustomerRegistration/src/php/list.php?id='+this.res_data;
    this.http.get(link).subscribe(
      data =>{  
       this.items=data._body;
      });
    }

答案 2 :(得分:0)

使用Vim正则表达式:

:%s/<\([^>]*\)>\(\_.\(DESIRED_STRING\)\@!\)\{-}<\/\1>//

此正则表达式使用否定的前瞻\@!来匹配不包含DESIRED_STRING的所有文本块。然后使用:%s命令删除这些块