从bash输出中排除一个字符串

时间:2016-08-02 08:51:18

标签: linux bash

我现在正在开展一个项目。在这个项目中,由于某些原因,我需要从与模式匹配的输出(或文件)中排除第一个字符串。困难在于我只需要排除一个字符串,只需从流中排出第一个字符串。 例如,如果我有:

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等的信息,但不明白我是否可以解决我的问题。 一切都有帮助,谢谢。

5 个答案:

答案 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

多数民众赞成!