Как изменить ряд символов между разделителями для точной строки?

Шаги, которые Вы описали для замены диска, должны быть достаточными. Если Вы - Windows двойной загрузки, можно столкнуться с проблемами.

При копировании файлов не забывайте сохранять все атрибуты файла. Если Вы используете cp, выполните его как таковой:

cp -a -r /deva/* /devb

Это - также хорошая идея проверить целостность скопированных файлов.

diff -qr /deva /devb

4
29.11.2014, 13:01
3 ответа

Возможно:

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 для глобального, но предположим, что это только один раз.
8
27.01.2020, 20:45

Здесь можно просто чередовать адреса -

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'

В приведенном выше примере адрес проверяет соответствие на brunching out из сценария для любого ! Не совпадающая строка , но она также выполняет двойную задачу сохранения переменного бита в \1 для следующей строки s///ubstitution, если любая строка прошла проверку на совпадение. Более того, все последующие команды также могут быть выполнены только в строке, которая соответствует начальному адресу.

И, конечно же, существует и менее строгая форма, которая определяет контекст функции соответствия фигурными скобками:

sed -e '
/^123@example.com:{SHA512-CRYPT}/{
    s/{[^:]*/REPLACE/
    #other function commands
};/other match function/{
    #still more commands...
}'
7
27.01.2020, 20:45

Используя awk:

awk -F':' '/^123@example.com/ {$2="NEWPASSWORDHERE"}1' OFS=':' infile

123@example.com:NEWPASSWORDHERE:::
abc@example.com:{SHA512-CRYPT}$6$0vthg.LubtSCxRRK$MdTKNQ2Vk8ZW3XQXNXStt9rfr6fNa‌​XqPvZ0o9WJ8mW8y9ozE1pi8dYM8oQzwWa8ESGzEmJO6yT/tgi3ZEqAiE0:::
  • я использовал awk с опцией -F для установки двоеточия(: ) в качестве разделителя полей и если строка start(^) с 123@example.com, то замените столбец2($2) на новое значение(NEWPASSWODHERE).

  • OFS=':' Меняет разделитель выходных полей с space(по умолчанию) на colon(:).

  • 1 на конце, по умолчанию, включает печать.

3
27.01.2020, 20:45

Теги

Похожие вопросы