2017-06-19 159 views
0

我想知道如何用一个长管替换空的结果,例如abcSed一个空字符串并将其替换为

所以,如果我过滤一个大的.txt文件与sedgrep和其他的东西。 有没有一种方法,在这个管道的末尾,我替换了一个空的结果? 因此,如果我没有在文件中找到我的模式,我得到一个abc

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

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

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

+1

你试过的命令有什么问题? –

+1

@EdMorton我认为他可以有一个多行输出,其中有一些空行。 –

回答

4

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

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

事实上,它也可以蛮好:

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

这将在管道中正常工作把更复杂的逻辑管道中,虽然你看不到这种风格非常频繁:

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

有没有一种方法可以让管道以sed结尾,而不是grep? – Zude

+0

我想在最后检查一下。所以如果最后一个命令(让我们说sed)给了我一个空字符串我回声abc – Zude

+0

尝试,'任意cmds | sed ... | {grep。 ||回声abc; }' –

1

我会用一个单一的awk命令:

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

我想让它没有像ark这样的命令。像cmd | cmd | cmd(如果为空,直到回显“abc”) – Zude

+1

为什么你想要那个? awk是为了这个。 – hek2mgl

+0

因为我想知道。我知道awk,但想知道如何解决没有 – Zude

0

使用

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") 
0

这可能为你工作(GNU SED):

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

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

相关问题