regexp (sed) unterdrücken "keine übereinstimmung" - Ausgabe
Bin ich stecken und kann nicht umbrochen, mein Kopf herum: Wie kann ich feststellen, sed, um den Rückgabewert gefunden, und auch sonst shut up?
Es ist wirklich über mir: Warum sollte sed zurück die ganze Zeichenfolge, wenn er nichts gefunden? Muss ich ausführen anderen test auf der zurückgegebenen Zeichenfolge, um es zu überprüfen? Ich habe versucht, mit "-n" aus dem (sehr kurzen) man-Seite aber effektiv unterdrückt alle Ausgaben, einschließlich der übereinstimmenden Zeichenfolgen.
Dies ist, was ich jetzt habe :
echo plop-02-plop | sed -e 's/^.*\(.\)\([0-9][0-9]\)\1.*$/\2/'
gibt
02
(und das ist in Ordnung und dandy, ich danke Ihnen sehr viel), aber:
echo plop-02plop | sed -e 's/^.*\(.\)\([0-9][0-9]\)\1.*$/\2/'
gibt
plop-02plop
(wenn er zurückkehren sollte, dies = "" nichts! Dang, Sie fanden nichts, also be quiet!
Für crying out loud !!)
Ich habe versucht, die Kontrolle für einen Wert zurück, aber dieser scheiterte ebenfalls ! Gasp!
$ echo plop-02-plop | sed -e 's/^.*\(.\)\([0-9][0-9]\)\1.*$/\2/' ; echo $?
02
0
$ echo plop-02plop | sed -e 's/^.*\(.\)\([0-9][0-9]\)\1.*$/\2/' ; echo $?
plop-02plop
0
$
Dieser Letzte, den ich gar nicht glauben. Ist sed
wirklich das tool sollte ich verwenden? Ich extrahieren möchten, eine Nadel aus einem Heuhaufen, und ich möchte eine Nadel oder nichts..?
- Wie Sie entdeckt haben,
sed
ist zu tun, wie Sie verlangen; es ist ein stream-editor und gibt seinen Eingang an seinen Ausgang, wie vom Skript geändert. Ihre nicht passenden Fall nicht die Daten zu ändern, also was war das echo war Ihre Eingabe - dies ist das richtige Verhalten fürsed
. Und die Antwort auf die Unterdrückung der Ausgabe ist die Verwendung-n
und fügen Sie dann eine explizitep
wenn Sie etwas gedruckt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
sed standardmäßig alle Zeilen ausgegeben.
Was Sie tun möchten, ist
IOW löschen von Zeilen passen nicht zu Ihrem Muster, und wenn Sie übereinstimmen, extrahieren Sie das element aus, geben erfassen von Gruppe Anzahl zum Beispiel. In Ihrem Fall es wird sein:
Können Sie auch
-n
option zum unterdrücken von echo alle Linien. Dann Zeile wird nur gedruckt, wenn Sie ausdrücklich erklären es. In der Praxis Skripte mit-n
sind in der Regel mehr und mehr zu mühsam zu warten. Hier wird es werden:Gibt es auch grep, aber dein Beispiel zeigt, warum die sed ist manchmal besser.
-n
version:sed -ne 's/^.*\(.\)\([0-9][0-9]\)\1.*$/\2/p'
die ist kürzer als die version ohne-n
.-n
ist in der Tat kürzer. Ich sollte geschrieben haben-n
Art und Weise, wie Sie vorgeschlagen von Anfang an, aber irgendwie rutschte meine Meinung. Ziemlich peinlich. 😉!
in meinem Textvorschlag (und möglicherweises///
Befehl zu sein, hängt davon ab, ob Sie möchten, um es zu ändern oder nicht). Für-n
Weg wäre es/patt/!p
.Vielleicht können Sie
egrep -o
?input.txt:
E. g.
Natürlich
egrep
wird etwas anders (besser?) die regex-syntax für fortgeschrittene Konstrukte (back-Referenzen, nicht-gierige Operatoren). Ich lasse Sie die übersetzung, wenn man wie der Ansatz.