Шаги, которые Вы описали для замены диска, должны быть достаточными. Если Вы - Windows двойной загрузки, можно столкнуться с проблемами.
При копировании файлов не забывайте сохранять все атрибуты файла. Если Вы используете cp
, выполните его как таковой:
cp -a -r /deva/* /devb
Это - также хорошая идея проверить целостность скопированных файлов.
diff -qr /deva /devb
Возможно:
sed 's/\(\(^\|:\)123@example\.com:\)\([^:]\+\)/\1foo/'
Учитывается не ударенные разграничители в стоимости.
sed 's/\(\(^\|:\)123@example\.com:\)\([^:]\+\)/\1foo/'
| | | | | | | |
| | | | | | | +----- H. End of sub.
| | | | | | +------- G. Sub string
| | | | | +---------- F. Match Group 1.
| | | | +------------ E. End of Group 3.
| | | +------------------ D. Group 3.
| | +----------------------------------- C. User
| +--------------------------------------------- B. Prefix Group 2.
+--------------------------------------------------- A. Substitute
A:
S /
Замените команду. B:
(^ |:)
начинается с начала строки или разделителя :
, группа 2, часть группы спичек 1. C:
Чтобы соответствовать, часть группы матчей 1. d:
([^:] +)
Часть для удаления, что-либо до :
. Часть группы 3. Все до следующего разделителя. Возможно, быть \ (: \ | $ \)
, но, как это должно закончиться в :
Это должно быть достаточно. E:
\)
Окончание группировки удаления. f:
\ 1
Положите заднюю группу матча 1. Пользователь + разделитель (ы). G:
foo
Что когда-либо можно вставить как склеп. H:
/
Завершит все это. OptiOanlly An / G
для глобального, но предположим, что это только один раз. Здесь можно просто чередовать адреса -
sed '/^123@example.com:{SHA512-CRYPT}/s/{[^:]*/REPLACE/'
Здесь команда восстановления s///
является функцией адреса /regxp/
и поэтому восстановление s///
даже не пытается, если сначала строка не совпадает с родительским адресом.
Или просто ш/к единичному с///
:
sed 's/^\(123@example.com:\){SHA512-CRYPT}[^:]*/\1REPLACE/'
Или путем привязки к заголовку строки только в том случае, если 123 не следует сразу за двоеточием:
sed 's/^\(\(.*:\)*123@example.com:\){SHA512-CRYPT}[^:]*/\1REPLACE/'
Хотя я, конечно, не чужд сложным подвыражениям, в данном случае такая вещь не нужна - обычно я предпочитаю адресную форму, когда я могу ее получить - я нахожу ее более удобной для чтения, более эффективной и полностью переносимой. Правда, на второй взгляд кажется, что я изначально переоценил врожденные сложности.
Аналогично, вы можете также разделить обратные ссылки и фактическую замену, как:
sed -e '
/^\(123@example.com:\){SHA512-CRYPT}[^:]*/!b
s//\1REPLACE/
#other commands that can be sure to affect only a line matching the 1st address'
В приведенном выше примере адрес проверяет соответствие на b
runching out из сценария для любого ! Не совпадающая строка
, но она также выполняет двойную задачу сохранения переменного бита в \1
для следующей строки s///
ubstitution, если любая строка прошла проверку на совпадение. Более того, все последующие команды также могут быть выполнены только в строке, которая соответствует начальному адресу.
И, конечно же, существует и менее строгая форма, которая определяет контекст функции соответствия фигурными скобками:
sed -e '
/^123@example.com:{SHA512-CRYPT}/{
s/{[^:]*/REPLACE/
#other function commands
};/other match function/{
#still more commands...
}'
Используя awk
:
awk -F':' '/^123@example.com/ {$2="NEWPASSWORDHERE"}1' OFS=':' infile
123@example.com:NEWPASSWORDHERE:::
abc@example.com:{SHA512-CRYPT}$6$0vthg.LubtSCxRRK$MdTKNQ2Vk8ZW3XQXNXStt9rfr6fNaXqPvZ0o9WJ8mW8y9ozE1pi8dYM8oQzwWa8ESGzEmJO6yT/tgi3ZEqAiE0:::
я использовал awk
с опцией -F
для установки двоеточия(:
) в качестве разделителя полей и если строка start(^
) с 123@example.com
, то замените столбец2($2
) на новое значение(NEWPASSWODHERE
).
OFS=':'
Меняет разделитель выходных полей с space(по умолчанию) на colon(:
).
1
на конце, по умолчанию, включает печать.