我现在正在做一个项目。在这个项目中,由于某些原因,我需要从与模式匹配的输出(或文件)中排除第一个字符串。困难在于我只需要排除一个字符串,即流中的第一个字符串。 例如,如果我有:
1 abc
2 qwerty
3 open
4 abc
5 talk
一些脚本工作后我应该有这个:
2 qwerty
3 open
4 abc
5 talk
注意:我对单词之前的数字一无所知,因此我无法使用有关它们的知识来过滤输出。
我用 grep 编写了一个小脚本,但它会删除与模式匹配的每个字符串:
'some program' | grep -v "abc"
阅读有关 awk、sed 等的信息,但不明白是否可以解决我的问题。 有什么帮助,谢谢。
使用awk:
some program | awk '{ if (/abc/ && !seen) { seen = 1 } else print }'
或者,仅使用过滤器:
some program | awk '!/abc/ || seen { print } /abc/ && !seen { seen = 1 }'
您可以使用Ex编辑器。例如,从文件中删除第一个模式:
ex +"/abc/d" -scwq file.txt
从输入中(将
cat
替换为您的程序):
ex +"/abc/d" +%p -scq! <(cat file.txt)
您还可以通过将
cat
替换为 /dev/stdin
来从标准输入中读取。
说明:
+cmd
- 执行 Ex/Vim 命令/pattern/d
- 找到模式并d删除,%p
- 打印当前缓冲区-s
- 静音模式-cq!
- 完全执行而不保存(!
)<(cmd)
- shell 进程替换使用 sed 给出要删除的行号
sed 1,2d
而不是 1 2 使用要删除的行号
否则你可以使用
sed '/pattrent to match/d'
我们可以在这里
sed '0,/abc/{//d;}'
awk '!/1/' file
2 qwerty
3 open
4 abc
5 talk
仅此而已!
{ list; }
到 read
第一行并打印其余内容:
command | { read first_line; cat -; }
简单的例子:
$ cat file
1 abc
2 qwerty
3 open
4 abc
5 talk
$ cat file | { read first_line; cat -; }
2 qwerty
3 open
4 abc
5 talk