Verwenden von „tee“, um eine Zeichenfolge an eine Datei anzuhängen und sie auch als Ersatz für ein Muster in einer anderen Datei zu verwenden

Verwenden von „tee“, um eine Zeichenfolge an eine Datei anzuhängen und sie auch als Ersatz für ein Muster in einer anderen Datei zu verwenden

Ich habe folgenden Code:

cat file | grep example | sed 's/http/https/' >> report.txt

Ausgabe dieses Befehls:

https://example.com/page/index.html

Dadurch wird ein Link mit HTTPS zur Datei hinzugefügt. Ich möchte jedoch, dass dieselbe Ausgabe auch "URL" in einer zweiten Datei ersetzt.

Inhalt der zweiten Datei:

TEXT TEXT
TEXT

URL

TEXT TEXT

Gewünschte Änderung in der zweiten Datei:

TEXT TEXT
TEXT

https://example.com/page/index.html

TEXT TEXT

Ist das möglich?

PS: Ich kann den Befehl nicht nochmal wiederholen, da es sich eigentlich nicht um ein einfaches Cat, sondern um einen Upload-Vorgang handelt, der den Befehl startet.

Antwort1

Fürs Protokoll: Sie müssen es nicht catund können es grepauch sedalleine tun:

sed '/URL/!d;s/http/&s/'

Vorausgesetzt, Sie führen eine Befehlskette aus, die eine einzelne Ausgabezeile erzeugt, können Sie Folgendes tun:

... | tee -a report.txt | sed 's|[\&/]|\\&|g;s|.*|s/URL/&/g|' | sed -f- -i infile.json

Dadurch wird die Ausgabe angehängt, report.txtaber auch an weitergeleitet, sedwodurch sie in einen sedBefehl umgewandelt wird, der dann an einen anderen Befehl weitergeleitet wird, der die Datei direkt sedbearbeitet ..json

Antwort2

Dies ist die kurze Antwort auf eine kurze Frage:

cat file | grep URL | sed 's/http/https/' | tee -a report.txt | while read $LINE; do
    sed --in-place -e "s·URL·$LINE·" thejsonfile.json
done

·Stellen Sie sicher, dass Sie alle drei im Skript durch ein Zeichen ersetzen, seddas nicht in enthalten ist $LINE, oder belassen Sie es als ·(mittlerer Punkt).

EDIT: Ich habe gerade aus einer anderen Frage gelernt, dass das Weiterleiten in eine while readSchleife aus Leistungsgründen und anderen Gründen als schlechte Praxis gilt. Damit wird Ihre Arbeit erledigt, also lasse ich das hier.

Antwort3

sed -n '/example/s/http/&s/p' file | tee -a report.txt |\
sed -e 'G;s/$/./;G;s/$/wq/;h;s|.*|/URL/c|;G' | ed -s - json_file

Wir erstellen einen edCode basierend auf der ersten Ausgabe und verwenden diesen, um die JSON-Datei zu bearbeiten.

verwandte Informationen