2016-12-05 5 views
0

Я пытаюсь выяснить, как искать и заменять пароль на определенной строке и конкретном столбце в TXT-файле. Это то, что он выглядит следующим образом:Bash: поиск и замена пароля в TXT-файле

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

И вот мой код:

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 

Предполагая, что пароль пользователя User1 заменяется с ТЕСТИРОВАНИЯ, это результат:

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

Что мне нужно:

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

Это связано с отсутствием цитаты. Однако вы можете просто заменить свои последние 2 строки на: 'sed -i 's/$ oldPass/$ newPass/g" users.txt'. Флаг '-i' для sed означает место на месте и будет непосредственно сохранять изменения в файле. – Aserre

ответ

1

Ваш оригинальный скрипт почти сработал и ему не хватало правильной цитаты. Вы могли бы написать: echo "$updatePass" > data с двойными кавычками для сохранения новых строк. Дополнительная информация о котировке here

Однако в вашем скрипте есть место для улучшения. Вы могли бы написать что-то вроде этого:

#!/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

Я попытался реализовать вышеупомянутое решение, но я все еще получаю тот же нежелательный вывод. Любая идея о том, почему это происходит? –

+0

Затем это должно быть связано с другой частью вашего кода. На данный момент я просто справился и вставил этот код в сценарий оболочки и использовал его против вашего образца ввода. – Aserre

+0

Я отправил исправленный код. Использование улучшенного кода дает те же результаты, что и изменение моего кода для использования sed -i, поэтому я решил использовать это только для простоты на данный момент. –

 Смежные вопросы

  • Нет связанных вопросов^_^