grep eine Datei und leitet die Ausgabe an sed weiter und speichert die SED-Ausgabe in einer Datei

Inhalt von source.txt:

gold  green white black blue
yellow magenta brown 
tram kilo charlie tango

Hallo an alle! Ich muss ein Rätsel lösen.

Ich versuche, ein kleines Skript auszuführen, um eine Datei zu erstellen source.txt, eine Ausgabe an grep zu senden [8]} Ersetzen Sie eine Zeichenfolge und speichern Sie diese Zeile in einer neuen Datei pol.txt

grep -l "gold" source.txt | xargs sed  's/green/red/' >  pol.txt

Anstatt die einzige Zeile in pol.txt gespeichert zu haben:

gold  red white black blue

Ich habe die gesamte Datei selbst mit der Zeichenfolge, die ich ersetzt habe

gold  red white black blue
yellow magenta brown 
tram kilo charlie tango

Wenn ich die Option -l aus dem grep-Befehl entferne, habe ich dies und von natürlich nichts in pol.txt

sed: can't read gold: No such file or directory
sed: can't read green: No such file or directory
sed: can't read white: No such file or directory
sed: can't read black: No such file or directory
sed: can't read blue: No such file or directory

grep wird als Tester benötigt und leider ist " if " keine Option.

Author: Giacomo1968, 2016-07-20

2 answers

Um eine Zeile mit gold aus der Quelle auszuwählen.txt und ersetzt das erste Vorkommen von green durch red:

$ sed  -n '/gold/{s/green/red/; p}' source.txt 
gold  red white black blue

Um das in einer Datei zu speichern:

sed  -n '/gold/{s/green/red/; p}' source.txt  >pol.txt

, Wie es funktioniert

  • -n weist sed an, keine Zeilen zu drucken, es sei denn, wir bitten dies ausdrücklich.

  • /gold/ wählt Zeilen aus, die dem regulären Ausdruck gold entsprechen.

  • s/green/red/ führt die substitution

  • p drucke.

Mit awk

Mit der gleichen Logik:

$ awk '/gold/{gsub(/green/, "red"); print}' source.txt 
gold  red white black blue

Mit grep

Wenn wir aus noch nicht erklärten Gründen gezwungen sind, eine Grep-Pipeline zu verwenden, versuchen Sie es:

$ grep -l --null "gold" source.txt | xargs -0 sed  -n '/gold/s/green/red/p'
gold  red white black blue
 6
Author: John1024,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2016-07-21 00:44:47

grep -l "gold" source.txt gibt source.txt aus, wenn die Datei das Wort gold enthält xargs sed 's/green/red/' wird sed 's/green/red/' source.txt und die endgültige Umleitung speichert das Ergebnis in Ihrer Ausgabe.

Wenn ich Ihre Absicht richtig verstehe, möchten Sie den folgenden Befehl:

sed -n '/gold/s/green/red/p' source.txt > pol.txt

Der Befehl /gold/ wählt Zeilen aus, die mit gold übereinstimmen, und der Befehl s führt den gewünschten Ersatz durch.

 1
Author: Satya Mishra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2016-07-20 21:22:56