2017-06-19 601 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