Ersetzen Sie die gesamte Spalte in einer Datei durch eine zufällige Zeichenfolge

7

Was ist der einfachste Weg, eine Spalte in einer Datei zu ersetzen? Grundsätzlich hat meine file.txt3 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.

dmx
quelle
Wird es für jede Zeile dieselbe Ersatzzeichenfolge sein?
Byte Commander
@ ByteCommander Ja, in meinem Skript werde ich die Variable behandeln
dmx
Sie möchten also nur eine Zeile verarbeiten, dann eine Anwendungslogik ausführen, um die Ersetzungsvariable zu aktualisieren, und dann die nächste Zeile verarbeiten? Ansonsten gibt es Tools, um die gesamte Datei auf einmal zu verarbeiten.
Byte Commander
@ByteCommander Ich möchte durch eine andere zufällige Zeichenfolge ersetzen. Es kann in einer Zeile erfolgen
dmx
1
Wenn Sie jede Zeile durch eine andere zufällige Zeichenfolge ersetzen möchten , würde ich die Verwendung von Perls Bytes :: Random :: Secure-Modul vorschlagen - siehe zum Beispiel Füllen der Spalte einer Textdatei mit zufälligen Daten mit bash
steeldriver

Antworten:

6

Angenommen, es file.txtenthä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:

replacement="my string"
sed "s/,.*,/,$replacement,/" file.txt

Ausgabe:

SveUJW24ibppfePgYeYHz7fC0,my string,yL6mCP0Do28k4EoTZUfKfqNYiIhGxxkA
xyRG8Da6kY35xeIT492Lul7xu,my string,ne6RIM2TeMQAax1GgzL7FeDrnQyHPH1i
sxTf13KlAnjtXodJouQ9V6m5b,my string,GUnApYwwDCZxWGZtzKzTU6sJRgHlUUfQ
7cjW5DZlXw1LYzVugbVyqfxRX,my string,XttE1In9eZQ8puJVUriuNvx2AJAxviGf
XiLE8r9AMqy5YZQ9BbIS6m559,my string,DssiszVBa05pbVDSOXNRaFXRxw0eZKHf
Sygrl5287BViOn0uQ9uCYipB1,my string,sD2O46sbh1yVIluoyn6Zm2OKXYe05vV9
Qi6DxJ96M0hxNe4cgux3iJ1aS,my string,wk2eF3f9xk5HowLzDIL3hCCNSmx8Uwi8
ZIX7qp5IIPekA0kzBdFR4IUQZ,my string,99ilfJWoJEBsKOfYI3buFfher07OCz6Y

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.txtstattdessen Änderungen vornehmen möchten , schreiben Sie sed -istatt einfach sed.


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:

while read line ; do
    replacement="random number $RANDOM"
    sed "s/,.*,/,$replacement,/" <<< "$line"
done < file.txt

Beispielausgabe:

SveUJW24ibppfePgYeYHz7fC0,random number 27584,yL6mCP0Do28k4EoTZUfKfqNYiIhGxxkA
xyRG8Da6kY35xeIT492Lul7xu,random number 2959,ne6RIM2TeMQAax1GgzL7FeDrnQyHPH1i
sxTf13KlAnjtXodJouQ9V6m5b,random number 5463,GUnApYwwDCZxWGZtzKzTU6sJRgHlUUfQ
7cjW5DZlXw1LYzVugbVyqfxRX,random number 12889,XttE1In9eZQ8puJVUriuNvx2AJAxviGf
XiLE8r9AMqy5YZQ9BbIS6m559,random number 3754,DssiszVBa05pbVDSOXNRaFXRxw0eZKHf
Sygrl5287BViOn0uQ9uCYipB1,random number 25375,sD2O46sbh1yVIluoyn6Zm2OKXYe05vV9
Qi6DxJ96M0hxNe4cgux3iJ1aS,random number 5284,wk2eF3f9xk5HowLzDIL3hCCNSmx8Uwi8

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:

bash my-replacement-script.sh > new-file.txt
Byte Commander
quelle
6

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:

perl -MBytes::Random::Secure=random_string_from -F, -ane '
  BEGIN{$chars = join "", ("a".."z","A".."Z",0..9)}
  $F[1] = random_string_from($chars, 32);
  print join ",", @F
' file

Wenn Sie Ihre /dev/urandomPipeline verwenden möchten, können Sie dies auch ohne externe Schleife mithilfe eines FIFO mit der getlineFunktion awk tun :

  1. mach den FIFO $ mkfifo _fifo

  2. Führen Sie Ihren Befehl aus und streamen Sie seine Ausgabe an das FIFO

    $ cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 > _fifo &
    

    oder (Beseitigung der nutzlosen Verwendung von Katze )

    $ tr -dc 'a-zA-Z0-9' < /dev/urandom | fold -w 32 > _fifo &
    
  3. Holen Sie sich Zeilen aus dem FIFO und ersetzen Sie sie durch die Zeilen der Zieldatei

    $ awk '{getline $2 < "_fifo"} 1' FS=, OFS=, file
    
  4. entferne den FIFO

    rm _fifo
    

Testen:

$ mkfifo _fifo
$ tr -dc 'a-zA-Z0-9' < /dev/urandom | fold -w 32 > _fifo &
[1] 5815
$ awk '{getline $2 < "_fifo"} 1' FS=, OFS=, file
SveUJW24ibppfePgYeYHz7fC0,hpqBxCOYIj7eQ9MgbPNG69SY3X3iAJ7A,yL6mCP0Do28k4EoTZUfKfqNYiIhGxxkA
xyRG8Da6kY35xeIT492Lul7xu,ACU1hyR8zGRfDMeUk4a6TFVcQvUAtZog,ne6RIM2TeMQAax1GgzL7FeDrnQyHPH1i
sxTf13KlAnjtXodJouQ9V6m5b,dkeKUnMYZepGcGMgdQc9IORa77Vtwr7w,GUnApYwwDCZxWGZtzKzTU6sJRgHlUUfQ
7cjW5DZlXw1LYzVugbVyqfxRX,UMjkPZAB3ElpOnXWnsQe9w1v0h6HMLPs,XttE1In9eZQ8puJVUriuNvx2AJAxviGf
XiLE8r9AMqy5YZQ9BbIS6m559,iz5tavnYqajwTokPCM4HJIsZlIloLcVy,DssiszVBa05pbVDSOXNRaFXRxw0eZKHf
Sygrl5287BViOn0uQ9uCYipB1,RHPFMgKoIGojvM6aTwb43lH4BAr8Jh5Y,sD2O46sbh1yVIluoyn6Zm2OKXYe05vV9
Qi6DxJ96M0hxNe4cgux3iJ1aS,fqTsEPr3PIPqIWPrb2uIl47QjXlSt3gL,wk2eF3f9xk5HowLzDIL3hCCNSmx8Uwi8
ZIX7qp5IIPekA0kzBdFR4IUQZ,uAFKvX5z2ik2i1AKh3wYp503xpNy8dxA,99ilfJWoJEBsKOfYI3buFfher07OCz6Y
rm _fifo
[1]+  Broken pipe             cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 > _fifo

Mit GNU awk können Sie das Äquivalent intern mithilfe getlineeines Co-Prozesses ausführen :

$ gawk '{"tr -dc 'a-zA-Z0-9' < /dev/urandom | fold -w 32" |& getline $2} 1' FS=, OFS=, file 
SveUJW24ibppfePgYeYHz7fC0,hKOYDf6lgEtVwzJvCl34eYu22m5bZ11e,yL6mCP0Do28k4EoTZUfKfqNYiIhGxxkA
xyRG8Da6kY35xeIT492Lul7xu,bV9m4OgbTzDTJQanhS3BTmxr5gUcouDy,ne6RIM2TeMQAax1GgzL7FeDrnQyHPH1i
sxTf13KlAnjtXodJouQ9V6m5b,r9850TtXPJsLLNMupiwSPsqx7ovtb5ph,GUnApYwwDCZxWGZtzKzTU6sJRgHlUUfQ
7cjW5DZlXw1LYzVugbVyqfxRX,aRRVAecWxeTtt3WX36MIoFlMCvDcFb3a,XttE1In9eZQ8puJVUriuNvx2AJAxviGf
XiLE8r9AMqy5YZQ9BbIS6m559,BeCoCV4kMb8FUt6Y3RFxolI2CKqzbeuO,DssiszVBa05pbVDSOXNRaFXRxw0eZKHf
Sygrl5287BViOn0uQ9uCYipB1,WZ0hSxurp22dCdhV12Gjcms6rdx8hjM2,sD2O46sbh1yVIluoyn6Zm2OKXYe05vV9
Qi6DxJ96M0hxNe4cgux3iJ1aS,ujxdLQZo1vkCZnkUej6pLjZxVmN7XiTE,wk2eF3f9xk5HowLzDIL3hCCNSmx8Uwi8
ZIX7qp5IIPekA0kzBdFR4IUQZ,qxp3dwltN5Mxfece27Zvq2NqbjPlF358,99ilfJWoJEBsKOfYI3buFfher07OCz6Y
Steeldriver
quelle
3

Verwenden von awk:

awk -v var="mystring" -F, 'BEGIN {OFS = FS} {$2 = var; print}'
  • -v: Erstellen Sie eine Variable mit dem Namen var"mystring".
  • -F,: ,als Feldtrennzeichen verwenden
  • BEGIN {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 den varInhalt. dann drucken.

Sie können auch Änderungen -v var="mystring"vornehmen, -v var="$variable"die $variableeine Variable in Ihrer Umgebung sind.


Hier ist ein Beispiel:

veUJW24ibppfePgYeYHz7fC0,64BzZdqrYY7Tx8sbj5tmEW,yL6mCP0Do28k4EoTZUfKfqNYiIhGxxkA
xyRG8Da6kY35xeIT492Lul7xu,gTdmvjmahIOoyzmrttVMvTc1ER0bt,ne6RIM2TeMQAax1GgzL7FeDrnQyHPH1i
sxTf13KlAnjtXodJouQ9V6m5b,LzLtoEg18E1brm66dPjcHZfpI107nn4h,GUnApYwwDCZxWGZtzKzTU6sJRgHlUUfQ

Lassen Sie uns den Befehl ausführen:

$ awk -v var="HERE-IS-MY-STRING" -F, 'BEGIN {OFS = FS} {$2 = var; print}' file.tx

veUJW24ibppfePgYeYHz7fC0,HERE-IS-MY-STRING,yL6mCP0Do28k4EoTZUfKfqNYiIhGxxkA
xyRG8Da6kY35xeIT492Lul7xu,HERE-IS-MY-STRING,ne6RIM2TeMQAax1GgzL7FeDrnQyHPH1i
sxTf13KlAnjtXodJouQ9V6m5b,HERE-IS-MY-STRING,GUnApYwwDCZxWGZtzKzTU6sJRgHlUUfQ
Ravexina
quelle