Ich versuche einen Weg zu finden, um den Unterschied zwischen zwei Zeichenfolgen in meinem Skript zu bestimmen. Ich könnte dies leicht mit diff oder comm tun, aber ich habe es nicht mit Dateien zu tun und ich würde es vorziehen, sie nicht in Dateien auszugeben, zu vergleichen und zurückzulesen.
Ich sehe, dass comm, diff, cmp alle erlauben, entweder zwei Dateien ODER eine Datei und eine Standardeingabe zu übergeben - ich denke, das ist gut, wenn ich nicht zwei Dateien ausgeben möchte ... aber es ist immer noch ein bisschen beschissen.
Ich habe herumgegraben und gedacht, ich kann grep oder reguläre Ausdrücke verwenden - aber ich denke nicht.
Antworten:
Verwenden
diff
odercom
oder was auch immer Sie wollen:Greg's Bash FAQ: Prozessersetzung
oder mit einem benannten Rohr
Greg's Bash FAQ: Arbeiten mit Named Pipes
Named Pipe wird auch als FIFO bezeichnet.
Das
-
allein ist für die Standardeingabe.<<<
ist eine "hier Zeichenfolge".&
ist wie;
, stellt es aber in den Hintergrundquelle
FUNC(){ echo "$@"; "$@"; }; FUNC diff <(echo a) <(echo b);
$ diff <(echo "Here are the letters in String One.") <(echo "Here are the characters in String Two.")
\n
1c1
\n
< Here are the letters in String One.
\n
---
\n
> Here are the characters in String Two.
\n
Verwendung der Pipe ist ähnlich, außer dass sie eine Prozessnummer anzeigt, mit der1c1
nach der nächsten beginnt$
und wartet, bis Sie <kbd> drücken. <kbd> eingeben (oder Sie können andere Befehle ausführen ...)Erinnert mich an diese Frage: Wie können Sie zwei Pipelines in Bash unterscheiden?
Wenn Sie sich in einer Bash-Sitzung befinden, können Sie Folgendes tun:
Durch das
<
Erstellen anonymer Named Pipes, die von Bash verwaltet werden, werden sie im Gegensatz zu temporären Dateien automatisch erstellt und zerstört.Wenn Sie es also schaffen, Ihre zwei verschiedenen Zeichenfolgen als Teil eines Befehls (grep, awk, sed, ...) zu isolieren, können Sie beispielsweise Folgendes tun:
(Wenn Sie annehmen, dass Sie in Ihren Dateizeilen Folgendes haben
string1=very_complicated_value
und astring2=another_long_and_complicated_value'
: Ohne das interne Format Ihrer Datei zu kennen, kann ich keinen genauen Befehl empfehlen.)quelle
Ich bevorzuge
cmp
und Process Substitution Feature von Bash:Wenn man auf Position 2 sagt, tritt ab für die erste, aber aq für die zweite auf. An Position 5 passiert ein weiterer Unterschied. Ersetzen Sie diese Zeichenfolgen einfach durch Variablen, und Sie sind fertig.
quelle
Angenommen, Sie haben drei Zeichenfolgen
So entfernen Sie das Präfix b aus a
So entfernen Sie das Suffix c aus a
quelle
echo "$a" | sed "s!^$b!!g"
(Ich habe das Standard-sed-Trennzeichen / für! Ausgetauscht, falls die behandelten Variablen Pfade sind. Sie können auch eine Zeichenfolge hier anstelle von echo verwenden :sed ... <<< $a
.)Ein anderes Beispiel:
Ausgänge
Ursprüngliche Antwort hier
quelle