2016-12-05 7 views
0

Ich versuche herauszufinden, wie Sie ein Kennwort für eine bestimmte Zeile und eine bestimmte Spalte in einer TXT-Datei suchen und ersetzen. Dies ist, wie es aussieht:Bash: Suchen und Ersetzen des Kennworts in einer TXT-Datei

Admin1 Pass1 1 
Admin2 Pass2 1 
User1 Upass1 0 
User2 Upass2 0 

Und hier ist mein Code:

while (true) 
do 
read -p 'Whose password would you like to change? Enter the corresponding user name.' readUser 
userCheck=$(grep $readUser users.txt) 

if [ "$userCheck" ] 
then 
    echo $userCheck > temp2.txt 

    read -p 'Enter the old password' oldPass 
     passCheck=$(awk '{print$2}' temp2.txt) 

    if [ "$passCheck" == "$oldPass" ] 
    then 

     read -p 'Enter the new password' newPass     
     sed -i "/^$readUser/ s/$oldPass/$newPass/" users.txt 
     break 
    else 
     echo 'The username and/or password do not match. Please try again.' 
    fi 
else 
    echo 'The username and/or password do not match. Please try again.' 
fi 
done 

Benutzer1 Passwort Unter der Annahme, mit TESTEN ersetzt, ist dies das Ergebnis:

Admin1 Pass1 1 Admin2 Pass2 1 User1 TESTING 0 User2 Upass2 0 

Was ich brauche ist das:

Admin1 Pass1 1 
Admin2 Pass2 1 
User1 TESTING 0 
User2 Upass2 0 
+0

Dies hat mit fehlenden Zitat zu tun. Sie können jedoch Ihre letzten 2 Zeilen einfach ersetzen durch: 'sed -i" s/$ oldPass/$ newPass/g "users.txt'. Das '-i'-Flag für sed bedeutet in-place und speichert die Änderungen direkt in der Datei. – Aserre

Antwort

1

Ihr ursprüngliches Skript war fast fertig und es fehlte nur das korrekte Zitat. Sie hätten schreiben können: echo "$updatePass" > data mit den doppelten Anführungszeichen, um die Zeilenumbrüche zu erhalten. Weitere Informationen zum Angebot here

Es gibt jedoch Raum für Verbesserungen in Ihrem Skript. Sie könnten etwas in der Art geschrieben haben:

#!/bin/bash 

while (true) 
do 
    read -p 'Whose password would you like to change?' readUser 

    # no need for a temporary variable here 
    if [ "$(awk -v a="$readUser" '$1==a{print $1}' users.txt)" ] 
    then 
     read -p 'Enter the old password' oldPass 
     # the awk code checks if the $oldPass matches the recorded password 
     if [ "$oldPass" == "$(awk -v a="$readUser" '$1==a{print $2}' users.txt)" ] 
     then 
      read -p 'Enter the new password' newPass 
      # the -i flag for sed allows in-place substitution 
      # we look for the line begining by $readUser, in case several users have the same password 
      sed -i "/^$readUser/ s/$oldPass/$newPass/" users.txt 
      break 
     else 
      echo 'The username and/or password do not match. Please try again.' 
     fi 
    else 
     echo 'The username and/or password do not match. Please try again.' 
    fi 
done 
+0

Ich habe versucht, die obige Lösung zu implementieren, aber ich bekomme immer noch die gleiche unerwünschte Ausgabe. Irgendeine Idee, warum das passiert? –

+0

Dann muss dies mit einem anderen Teil Ihres Codes zusammenhängen. Ab sofort habe ich diesen Code einfach in ein Shell-Skript kopiert und eingefügt und für Ihre Beispieleingabe verwendet. – Aserre

+0

Ich habe den überarbeiteten Code veröffentlicht. Die Verwendung Ihres verbesserten Codes lieferte die gleichen Ergebnisse wie die Änderung meines Codes für die Verwendung von sed -i. Daher habe ich mich entschieden, das zur Vereinfachung zu verwenden. –

Verwandte Themen