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.
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 Ausdruckgold
entsprechen.s/green/red/
führt die substitutionp
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
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.
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