Was ist der einfachste Weg, eine Spalte in einer Datei zu ersetzen? Grundsätzlich hat meine file.txt
3 Spalten durch getrennt ,
.
Wie kann ich die zweite Spalte mit einem Bash-Skript ändern?
SveUJW24ibppfePgYeYHz7fC0,64BzZdqrYY7Tx8sbj5tmEW,yL6mCP0Do28k4EoTZUfKfqNYiIhGxxkA
xyRG8Da6kY35xeIT492Lul7xu,gTdmvjmahIOoyzmrttVMvTc1ER0bt,ne6RIM2TeMQAax1GgzL7FeDrnQyHPH1i
sxTf13KlAnjtXodJouQ9V6m5b,LzLtoEg18E1brm66dPjcHZfpI107nn4h,GUnApYwwDCZxWGZtzKzTU6sJRgHlUUfQ
7cjW5DZlXw1LYzVugbVyqfxRX,i7B4Q9w8h5anmMW87DfIBEm0AuNjbLGq,XttE1In9eZQ8puJVUriuNvx2AJAxviGf
XiLE8r9AMqy5YZQ9BbIS6m559,ToT2wbQdpNNySPxP1Tgz1,DssiszVBa05pbVDSOXNRaFXRxw0eZKHf
Sygrl5287BViOn0uQ9uCYipB1,TEYnXl6APWGbm9ckLCcHFUJzk7qS8JXH,sD2O46sbh1yVIluoyn6Zm2OKXYe05vV9
Qi6DxJ96M0hxNe4cgux3iJ1aS,LK3GHTpuo9kbmK9McRN4sFRQTGh2DU8J,wk2eF3f9xk5HowLzDIL3hCCNSmx8Uwi8
ZIX7qp5IIPekA0kzBdFR4IUQZ,9m9lEjfiotQ97s3uVN8EEP7Y1JmpgAk7,99ilfJWoJEBsKOfYI3buFfher07OCz6Y
Update
durch eine andere Zeichenfolge in einer Variablen ersetzen. sagen wir mal var=new-sting
.
Eigentlich dachte ich, ich könnte so etwas machen:
sed "s/,[^,]*/,$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)/" file.txt
Aber es funktioniert nicht wie erwartet. Ich habe immer und immer wieder die gleiche Saite.
Antworten:
Angenommen, es
file.txt
enthält Textzeilen, die in drei Spalten mit Kommas unterteilt sind, und es gibt nirgendwo zusätzliche Kommas, sodass jede Zeile genau zwei davon enthält:Ausgabe:
Dadurch werden alle Zeilen gleichzeitig verarbeitet und die mittlere Spalte jedes Mal durch denselben Wert ersetzt. Der geänderte Inhalt wird standardmäßig auf dem Terminal gedruckt. Wenn Sie
file.txt
stattdessen Änderungen vornehmen möchten , schreiben Siesed -i
statt einfachsed
.Wenn Sie die Ersetzungsvariable für jede Zeile trotzdem aktualisieren müssen (hier eine neue Zufallszeichenfolge für jede Zeile), können Sie die Zeilen wie folgt durchlaufen:
Beispielausgabe:
Es ist wahrscheinlich der einfachste Weg, dieses Code-Snippet in eine Skriptdatei einzufügen, und dann haben Sie die Ausgabe in eine separate neue Datei (nicht die Originaldatei, aus der Sie gelesen haben!) Umgeleitet:
quelle
Ich würde einen Ansatz vorschlagen, der auf dem Perl- Modul Bytes :: Random :: Secure basiert und darauf basiert, die Spalte der Textdatei mit zufälligen Daten zu füllen, indem bash verwendet wird , um die gewünschte Mischung aus Groß- und Kleinbuchstaben und Dezimalstellen zu verwenden:
Wenn Sie Ihre
/dev/urandom
Pipeline verwenden möchten, können Sie dies auch ohne externe Schleife mithilfe eines FIFO mit dergetline
Funktion awk tun :mach den FIFO
$ mkfifo _fifo
Führen Sie Ihren Befehl aus und streamen Sie seine Ausgabe an das FIFO
oder (Beseitigung der nutzlosen Verwendung von Katze )
Holen Sie sich Zeilen aus dem FIFO und ersetzen Sie sie durch die Zeilen der Zieldatei
entferne den FIFO
Testen:
Mit GNU awk können Sie das Äquivalent intern mithilfe
getline
eines Co-Prozesses ausführen :quelle
Verwenden von
awk
:-v
: Erstellen Sie eine Variable mit dem Namenvar
"mystring".-F,
:,
als Feldtrennzeichen verwendenBEGIN {OFS = FS}
Setzen Sie das Ausgabefeldtrennzeichen auf das Feldtrennzeichen, um das Trennzeichen (Komma) nach dem Austausch beizubehalten{$2 = var; print}
Ersetzen Sie das Feld 2 (Spalte 2) durch denvar
Inhalt. dann drucken.Sie können auch Änderungen
-v var="mystring"
vornehmen,-v var="$variable"
die$variable
eine Variable in Ihrer Umgebung sind.Hier ist ein Beispiel:
Lassen Sie uns den Befehl ausführen:
quelle