2017-06-19 4 views
0

Ich möchte wissen, wie man ein leeres Ergebnis mit abc zum Beispiel in einem langen Rohr ersetzen.Sed einen leeren String und ersetzen Sie es

Also, wenn ich eine große. Txt-Datei mit sed und grep und andere Sachen filtern. Gibt es eine Möglichkeit, dass ich am Ende dieser Pipe ein leeres Ergebnis ersetze? So dass, wenn ich mein Muster in der Datei nicht finde ich ein abc

Ich arbeite in sh und will es in der langen Leitung enthalten, ohne spezielle Sachen zu verwenden. Ich habe versucht:

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

und

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

.

+1

Was war falsch an dem Befehl, den Sie ausprobiert haben? –

+1

@EdMorton Ich denke, dass er eine mehrzeilige Ausgabe mit einigen leeren Zeilen unter ihnen haben kann. –

Antwort

4

Ich denke, Sie sagen, dass, wenn grep produziert keine Übereinstimmungen, Sie "abc" sehen möchten. Ich weiß nicht, ob dies gilt als „special stuff“, aber Sie können tun:

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

Diese in einer Pipeline gut funktionieren wird:

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

In der Tat, es funktioniert auch ganz gut zu setzen komplexere Logik in einer Pipeline, obwohl man diesen Stil nicht sehr oft sehen:

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

Gibt es einen Weg, wo ich es machen kann, wenn das Rohr mit sed endet und nicht mit grep? – Zude

+0

Ich möchte dies ganz am Ende überprüfen. Wenn also auch der letzte Befehl am Ende (sagen wir sed) mir einen leeren String gibt, echo abc – Zude

+0

Versuch, 'beliebige cmds | sed ... | {Grep. || Echo abc; } ' –

1

ich einen einzelnen awk Befehl verwenden würde:

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

Ich möchte es ohne Befehle wie Arche machen. Wie cmd | cmd | cmd (wenn leer bis hierhin echo "abc") – Zude

+1

Warum willst du das? 'awk' ist dafür gedacht. – hek2mgl

+0

Weil ich es wissen will. Ich weiß awk aber möchte wissen, wie man ohne es löst – Zude

0

Verwenden

tee >(read || echo "abc") 

Erläuterung: Sie für leere Eingabe mit

pipeline_with_sed | grep -q . || echo "abc" 

Dies hat verschiedene Probleme suchen.
Wenn die Ausgabe leer ist, ist sie nicht leer. So sollten Sie für alle Daten prüfen:

pipeline_with_sed | read || echo "abc" 

Dies wird Ihre „abc“ für leere Ausgabe der Pipeline geben.
Jetzt möchten Sie die ursprüngliche Ausgabe sehen, wenn etwas da ist.
Mit tee können Sie die Ausgabe in eine Datei und einen anderen Prozess umleiten.
Und die Umleitung zu einer Datei kann auch ersetzt werden, um in ein anderes Programm zu schreiben.

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

Dies könnte für Sie arbeiten (GNU sed):

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

Wenn Zeichenfolge gefunden es drucken und beenden. Andernfalls am Ende der Datei die letzte Zeile auf abc ändern.