【问题标题】:Sed an empty String and replace itsed 一个空字符串并替换它
【发布时间】:2017-11-21 21:20:31
【问题描述】:

我想知道如何用abc 替换空结果,例如在长管道中。

所以如果我用sedgrep 和其他东西过滤一个大的.txt 文件。 有没有办法在这个管道的末端替换一个空结果? 所以如果我在文件中找不到我的模式,我会得到一个abc

我在 sh 中工作并希望它包含在长管道中而不使用特殊的东西。 我试过了:

cat myfile.txt | grep 'blabla.*' | sed 's/^$/abc/g'

`cat myfile.txt | grep 'blabla.*' | sed 's//abc/g'`

【问题讨论】:

  • 您尝试的命令有什么问题?
  • @EdMorton 我认为他可以有一个多行输出,其中包含一些空行。

标签: linux shell unix sed sh


【解决方案1】:

我想你是说如果grep 没有匹配,你想看到“abc”。我不知道这是否算作“特殊的东西”,但你可以这样做:

grep 'blabla.*' myfile.txt || echo abc

这将在管道中正常工作:

cmd1 | cmd2 | { grep 'blabla.*' || echo abc; } | cmd3 | cmd4

事实上,将更复杂的逻辑放入管道中也可以很好地工作,尽管您不经常看到这种风格:

cmd1 |
if grep blabla.*; then : ; else echo abc; fi |
cmd2

【讨论】:

  • 当管道以 sed 而不是 grep 结束时,我有办法做到吗?
  • 我想在最后检查一下。因此,如果最后的最后一个命令(比如说 sed)给了我一个空字符串 i echo abc
  • 试试看,arbitrary cmds | sed ... | { grep . || echo abc; }
【解决方案2】:

我会使用一个awk 命令:

awk '/blabla/{print;found=1}END{if(!found){print "not found"}}' myfile.txt

【讨论】:

  • 我想在没有 ark 之类的命令的情况下制作它。像 cmd|cmd|cmd(如果这里为空,则回显 "abc")
  • 你为什么要那个? awk 就是为此而生的。
  • 因为我想知道。我知道 awk 但想知道如何在没有的情况下解决
【解决方案3】:

使用

tee >(read || echo "abc")

说明: 您可以使用

查找空输入
pipeline_with_sed | grep -q . || echo "abc"

这有不同的问题。
当输出有空行时,它不是空的。所以你应该测试任何数据:

pipeline_with_sed | read || echo "abc"

这将为管道的空输出提供“abc”。
现在您想在有东西时查看原始输出。
使用tee,您可以将输出重定向到一个文件和另一个进程。
并且重定向到文件也可以替换为写入另一个程序。

pipeline_with_sed | tee >(read || echo "abc")

【讨论】:

    【解决方案4】:

    这可能对你有用(GNU sed):

    sed '/blabla/q;$!d;cabc
    

    如果找到字符串,打印并退出。否则在文件末尾将最后一行更改为abc

    【讨论】:

      猜你喜欢
      • 2020-01-12
      • 2014-09-05
      • 1970-01-01
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 2011-12-21
      • 2021-03-16
      • 2014-01-25
      相关资源
      最近更新 更多