使用grep / awk / bash / etc删除文件中最后一次出现的模式的最简单方法是什么?例如,我有一个文件,其中表达式“hello world”出现多次,我想删除整行或者只是最后一次出现“hello world”。谢谢!
答案 0 :(得分:1)
如果您碰巧拥有GNU coreutils(或者您愿意安装它们),您可以使用偶尔有用的tac
命令来翻转文件进行处理,从而可以将此问题视为“删除< em>第一次出现模式“,这有点简单:
tac /path/to/file | awk '!found && /Hello, world/{found=1;next}1' | tac
否则,你需要做一些事情,比如在内存中缓冲文件的所有行,以便你可以在最后打印出来。或者您可以处理该文件两次,第一次只是查找要省略的行号,但这要求数据在文件中,而不是您输入命令的流:
awk \
-v line="$(grep -hn "hello world" /path/to/file | tail -n1 | cut -f1 -d:)" \
"{NR != line}" /path/to/file
答案 1 :(得分:1)
你可以这样做:
awk '/^hello world/ {max=NR}
{a[NR]=$0}
END{for (i=1;i<=NR;i++) {if (i!=max) print a[i]}}' file
或者,如果文件大小是一个问题,请遍历它两次并使用grep
来计算匹配。使用awk
跳过最后一场比赛:
awk -v last=$(grep -c '^hello world' file) '/^hello world/ && ++cnt==last{ next } 1 ' file
答案 2 :(得分:1)
您可以两次读取文件,并且可以在不使用import { Component, OnInit } from '@angular/core';
import { AngularFire } from 'angularfire2';
import { FormBuilder } from '@angular/forms';
import { Router } from '@angular/router';
@Component({
selector: 'app-signup',
templateUrl: './signup.component.html',
styleUrls: ['./signup.component.scss']
})
export class SignupComponent {
public signupForm = this.fb.group({
email: [""],
password: [""]
});
constructor(private router: Router, public fb: FormBuilder, public af: AngularFire) {}
signup() {
console.log(this.signupForm.value);
this.af.auth.createUser(this.signupForm.value).catch(function(error) {
alert(error.message);
});
this.router.navigate(['store'])
}
}
<强>输入强>
tac
<强>输出强>
[akshay@gold tmp]$ cat f
1 hai
2 hello
3 this
4 is
5 test
6 hello
7 this
8 is
9 test
<强>解释强>
[akshay@gold tmp]$ awk 'last==FNR{next}FNR!=NR{print;next}/hello/{last=FNR}' f f
1 hai
2 hello
3 this
4 is
5 test
7 this
8 is
9 test
- 它提供了处理的记录总数。
NR
- 它给出了每个输入文件的总记录数。
FNR