Ich suche nach der Zeichenfolge ::=BEGIN
und möchte eine Bedingung anwenden, um zu überprüfen, ob das Wort gefunden wurde.
Was ich damit meine, ist etwas in dieser Richtung:
if (sed command does find a match for "::=BEGIN")
then i=1
else i=0
Außerdem möchte ich, dass 1 (für yes found) und 0 (not found) in die Variable "i" eingefügt werden.
Bitte hilf mir. Erklären Sie auch die Lösung! Vielen Dank!
command-line
bash
sed
SamFlynn
quelle
quelle
grep '::= BEGIN' filename &> /dev/null
und dann überprüfen$?
.&> /dev/null
sed
Version für Sie =)Antworten:
grep
macht diesen Job gut genug.Der Code führt einfach eine stille Suche innerhalb der Subshell durch.
&&
Der logische UND-Operand prüft, ob der erste Befehl erfolgreich war. Wenn dies der Fall ist, wird er ausgeführtecho "FOUND"
.||
prüft, ob dieses Echo ausgeführt wurde, dh ob wir etwas gefunden haben. Das zweite Echo wird nur ausgeführt, wenn der erste Befehl fehlgeschlagen ist.Hier ist eine
awk
Version:Grundidee ist hier einstellen
i
zuNOTFOUND
, und wenn wir den String finden - ändern esFOUNDIT
. Am Ende, nachdem der erste Satz der Verarbeitungsdatei fertig ist, werden wir druckeni
und erfahren, ob wir etwas gefunden haben oder nicht.Bearbeiten: In dem Kommentar haben Sie erwähnt, dass Sie das Ergebnis in eine Variable einfügen möchten. Shell stellt bereits eine Variable bereit, die den Exit-Status des vorherigen Befehls meldet
$0
. Exit Status 0 bedeutet Erfolg, alles andere - scheitern. Zum Beispiel,Wenn Sie den Exit-Status in einer Variablen verwenden möchten, können Sie dies folgendermaßen tun :
MYVAR=$(echo $?)
. Erinnerst du dich, $? Exit-Status des vorherigen Befehls melden. Sie müssen dies also direkt nach dem Befehl grep verwenden.Wenn Sie weiterhin meine früheren Einzeiler awk und grep verwenden möchten, können Sie denselben Trick verwenden
MYVAR=$()
und den gewünschten Befehl zwischen die geschweiften Klammern setzen. Die Ausgabe wird der Variablen zugewiesenMYVAR
.quelle
sed's
Syntax, die manchmal zu einem riesigen Durcheinander werden kann. Außerdem ist es ein Werkzeug zum Bearbeiten von Sachen, nicht zum Suchen.grep
ist das richtige Werkzeug dafür. In Ihrer ursprünglichen Frage haben Sie nicht erwähnt, dass Sie das Ergebnis in eine Variable einfügen. Bitte fügen Sie das hinzu. Ich werde meine Antwort in einer Sekunde bearbeiten, um diese Anforderung zu erfüllenMit einer GNU
sed
(wie standardmäßig auf jedem Ubuntu-System installiert) :Einige Fakten zu dieser Antwort:
sed
Q
uits Eingabe, sobald die allererste Übereinstimmung irgendwo in der Datei gefunden wird - was bedeutet, dass keine Zeit mehr damit verschwendet wird, die Datei weiterzulesen.sed
Gibt in seinem Exit-Code den numerischen Wert 0 oder 1 zurück, je nachdem, ob der adressierte reguläre Ausdruck nicht gefunden werden konnte / konnte.$i
wirdsed
beim Verlassen auf 's return gesetzt.Die
{
Gruppierung; }
wird verwendet, um mögliche Umleitungsfehler zuverlässig zu behandeln. Sie$i
wird nicht festgelegt, wenn die Shell die Datei überhaupt nicht öffnen kann, um Fehlalarme zu vermeiden.Dies sollte jedoch wahrscheinlich nicht vorgezogen
grep -q
werden, da dies im Grunde auch alle oben genannten Aufgaben ausführen kann (wenn umgekehrt) , POSIXly und normalerweise schneller.Die bereits gegebene
grep -q
Antwort ist sehr gut, aber etwas kürzer:quelle
Sie können dies verwenden:
Dadurch wird die Datei
file.txt
zeilenweise durchsucht. Wenn eine Übereinstimmung::=BEGIN
gefunden wird, wird die Variable festgelegti=1
und beendet. Wird keine Übereinstimmung gefunden, wird die Variable auf gesetzti=0
.quelle
Meine
sed
Versionin einer Variablen speichern
i
:Beispiel:
Erläuterung:
::=BEGIN
gefunden, drucken Sie a1
und springen Sie zunext
::=BEGIN
nicht gefunden, drucken Sie0
quelle
sed
(Stream EDitor ) ist nicht das richtige Werkzeug für diese Art von Dingen: Sie können einfach einebash
if
Anweisung verwenden, um Ihre Eingabe mit einem regulären Ausdruck abzugleichen:input="$(< inputfile)"
: weistinputfile
der Variablen den Inhalt von zu$input
[[ "$input" =~ ::=BEGIN ]] && i=1 || i=0
: vergleicht den regulären Ausdruck::=BEGIN
mit dem Inhalt der Variablen$input
; wenn es ein Spiel ist es ordnet1
an$i
, andernfalls ordnet sie0
zu$i
quelle