我需要一个可用于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”是修饰语,我要查找的单词
谢谢!!
答案 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
命令删除这些块