我现在正在开展一个项目。在这个项目中,由于某些原因,我需要从与模式匹配的输出(或文件)中排除第一个字符串。困难在于我只需要排除一个字符串,只需从流中排出第一个字符串。 例如,如果我有:
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等的信息,但不明白我是否可以解决我的问题。 一切都有帮助,谢谢。
答案 0 :(得分:5)
使用awk:
some program | awk '{ if (/abc/ && !seen) { seen = 1 } else print }'
或者,仅使用过滤器:
some program | awk '!/abc/ || seen { print } /abc/ && !seen { seen = 1 }'
答案 1 :(得分:3)
您可以使用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 elete,%p
- 打印当前缓冲区-s
- 无声模式-cq!
- 执行完全而不保存(!
)<(cmd)
- shell进程替换答案 2 :(得分:0)
使用要删除的sed提供行号
sed 1,2d
而不是1 2使用您要删除的行号
否则你可以使用
sed '/pattrent to match/d'
这里我们可以
sed '0,/abc/{//d;}'
答案 3 :(得分:0)
你也可以在第一行使用{ 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
答案 4 :(得分:0)
awk '!/1/' file
2 qwerty
3 open
4 abc
5 talk
多数民众赞成!