【问题标题】:Exclude one string from bash output从 bash 输出中排除一个字符串
【发布时间】:2016-08-02 08:51:18
【问题描述】:

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

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

【问题讨论】:

  • 是的,我可以。如果我将上面的脚本与上面的输出一起使用,我将得到下一个答案:“2 qwerty 3 open 5 talk”。你看,我需要最后一个“4 abc”字,但我没有。我明白为什么。我不明白的东西 - 如何修改脚本,或者我应该使用什么样的工具。
  • 只需要剪掉第一个出现的单词吗?
  • @user3016814:如航海问题,您只需要删除第一个匹配项?
  • 是的,好像是这样的,我需要删除单词最先出现的字符串。
  • 非常感谢。我一直在努力解决这个问题,现在它解决了=)

标签: linux bash


【解决方案1】:

使用 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! - 完全执行而不保存 (!)
    • &lt;(cmd) - shell 进程替换

    【讨论】:

    • 看起来不错,但我需要等待一段时间才能理解这个=)
    【解决方案3】:

    您还可以在第一行使用命令列表{ 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】:

      使用 sed 给出要删除的行号

      sed 1,2d
      

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

      否则你可以使用

      sed '/pattrent to match/d'
      

      我们可以有

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

      【讨论】:

      • 查看可以根据特定模式删除行的更改
      • @jibe 现在它比上面的解决方案更智能。
      • 还是错了。您的第一个解决方案删除了​​ 1 和 2 之间的行。第二个删除与模式匹配的所有行。第三个删除从开头到与模式匹配的行的所有行,所以如果模式不在第一行而是在最后,它将删除很多文本。
      • 效果很好..你是天才
      【解决方案5】:
      awk '!/1/' file
      2 qwerty
      3 open
      4 abc
      5 talk
      

      就是这样!

      【讨论】:

        猜你喜欢
        • 2017-06-04
        • 2011-07-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-04
        • 2017-04-06
        • 2023-02-18
        • 2013-06-27
        • 1970-01-01
        相关资源
        最近更新 更多