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

问题描述 投票:0回答:5

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

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

linux bash
5个回答
7
投票

使用awk:

some program | awk '{ if (/abc/ && !seen) { seen = 1 } else print }'

或者,仅使用过滤器:

some program | awk '!/abc/ || seen { print } /abc/ && !seen { seen = 1 }'

2
投票

您可以使用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 进程替换

1
投票

使用 sed 给出要删除的行号

sed 1,2d

而不是 1 2 使用要删除的行号

否则你可以使用

sed '/pattrent to match/d'

我们可以在这里

sed '0,/abc/{//d;}'

1
投票
awk '!/1/' file
2 qwerty
3 open
4 abc
5 talk

仅此而已!


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
© www.soinside.com 2019 - 2024. All rights reserved.