Sed изменить дату рождения с использованием регулярного выражения

Классический метод резервного копирования - использовать такие инструменты, как tar и dump для резервного копирования файлов, обычно с частыми инкрементными резервными копиями. Как вы уже упоминали, это была Windows, которая популяризировала резервные копии типа изображения, так как не хватало возможности резервного копирования файлов, которые были в использовании. Резервное копирование на уровне файлов позволяет выполнять инкрементное резервное копирование и восстановление. С резервными копиями изображений это вообще или ничего. При восстановлении обычных резервных копий вы можете восстановить другой тип файловой системы, а всякая фрагментация в старой файловой системе оставлена ​​позади. Резервные копии изображений вернули все, как было. После восстановления обычной резервной копии вам нужно переустановить загрузчик вручную, но с резервными копиями изображений это простой процесс.

Если вы собираетесь делать резервное копирование изображения, вы хотите использовать умнее такие как partclone или ghost4linux, а не dd, который не различает используемые и свободные части файловой системы. Пропуск свободных частей позволяет значительно уменьшить изображение и ускорить время резервного копирования / восстановления. Другим ограничением резервных копий изображений является то, что они не могут быть восстановлены на меньшем диске / разделе, чем оригинал, даже если это было в основном свободное пространство.

1
задан 18 October 2014 в 22:52

2 ответа

[1-12]\/[0-31] и [0-99] не означают от 1 до 12, от 0 до 31 и от 0 до 99.

[1-12] означает диапазон символов, начинающихся с 1 до 1, и 2. По существу: [12]. (Сравнить с [0-1a].) [F7] означает диапазон символов начиная с 0 до 3 и 1: [0123].

Аналогично для [0-99]. Выразить диапазон чисел с помощью регулярных выражений непросто.

Если числа не используют двойные цифры (01/06/33), вам нужно будет сделать что-то вроде: [0-9]{1,2} для дня и месяц и [0-9]{2} за год, или регулярное выражение будет быстро расти громоздким. Это, конечно, рискует выделить что-то вроде 99/99/99.

Пример:

$ sed "s/^\(muru\/\)[0-9]\{1,2\}\/[0-9]\{1,2\}\/[0-9]\{2\}/\111\/14\/46/g" <<<'muru/1/4/85'
muru/11/14/46
$ sed "s/^\(muru\/\)[0-9]\{1,2\}\/[0-9]\{1,2\}\/[0-9]\{2\}/\111\/14\/46/g" <<<'muru/10/4/85'
muru/11/14/46
$ sed "s/^\(muru\/\)[0-9]\{1,2\}\/[0-9]\{1,2\}\/[0-9]\{2\}/\111\/14\/46/g" <<<'muru/10/28/85'
muru/11/14/46

Предполагаю, что вы хотите сохранить имя, поэтому я использовал обратные ссылки для ссылайтесь на него в подстановке (\1).

0
ответ дан 24 May 2018 в 02:47
  • 1
    Кажется, я слежу за тобой. Не могли бы вы привести явный пример, чтобы я мог полностью понять вас? – Justin 18 October 2014 в 05:11
  • 2
    @Justin это обновление полезно? – muru 18 October 2014 в 05:18

Даты сложны, но упрощаются в той же степени, что и ваша попытка ...

sed -r 's,^PersonsName1?[0-9]/[1-3]?[0-9]/[0-9]{2},11/14/46,' txt.file

Объяснение

Используйте -r для расширенных регулярных выражений. Это позволяет (например) ?. Как правило, я предпочитаю одиночные кавычки ', а не double ", поэтому нет расширения оболочки. Вместо использования / в качестве разделителей sed вы можете использовать все, что захотите. Здесь я использовал ,, так что нам не нужно бежать буквально / s. 1?[0-9] соответствует необязательному 1 и требуется 0-9, за месяц. [1-3]?[0-9] соответствует и необязательно 1-3, а для 0 - 0-9. [0-9]{2} соответствуют двум цифрам за год. Нотабене что это потенциально может иметь некоторые ложные совпадения. например 0/0/00 и 19/39/99 будут совпадать, но вы можете больше настроить регулярное выражение, если хотите. См. Ссылку выше для получения дополнительной информации.

Дополнительные комментарии

Обратите внимание, что это соответствует чем-то вроде PersonsName11/11/11 и заменяет все, что было сделано в вашей попытке. Если вы хотите только заменить дату, вы можете использовать следующее.

sed -r 's,^(PersonsName)1?[0-9]/[1-3]?[0-9]/[0-9]{2},\111/14/46,' txt.file

Здесь мы фиксируем PersonsName, используя parens. Затем мы можем обратиться к нему снова в разделе замены с помощью \1.

0
ответ дан 24 May 2018 в 02:47

Другие вопросы по тегам:

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