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

Я интересуюсь изменением даты рождения в текстовом файле на другую дату от 14.11.46. Я хочу сделать это, не имея необходимость знать предыдущую дату рождения и вместо этого мочь искать в общем. Я знаю имя человека, с которым связана дата рождения, таким образом, я могу использовать это для создания замены

Я попробовал это:

sed "s/^PersonsName\/[1-12]\/[0-31]\/[0-99]/11\/14\/46/g" txt.file

Но это не работает, и я не уверен, как продолжить двигаться


Предложенные ответы ниже не работали на меня. Я собираюсь дать некоторые данные в качестве примера и видеть, помогает ли это разъясниться.

Popeye Sailor:156-454-3322:945 Bluto Street, Anywhere, USA 29358:3/19/35:22350

Давайте притворимся, что я пытаюсь изменить дату рождения Popeye (который является в конце), но я хочу искать, не имея необходимость знать его текущий. Я знаю, что использование регулярного выражения является ключевым здесь, но до сих пор примеры, которые я видел, не работали. Возможно, обеспечение вышеупомянутых данных в качестве примера поможет

[Ожидаемый Вывод]

Popeye Sailor:156-454-3322:945 Bluto Street, Anywhere, USA 29358:11/14/46:22350

Все я интересуюсь изменением, является датой рождения в конце 11/14/46

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

3 ответа

Вы могли использовать ниже команды sed,

$ sed '/^Popeye Sailor:/s/:[^:]*\(:[^:\/]*\)$/:11\/14\/46\1/' file
Popeye Sailor:156-454-3322:945 Bluto Street, Anywhere, USA 29358:11/14/46:22350

Она изменяет дату только на строках, который запускается с Popeye Sailor:

0
ответ дан 4 August 2019 в 12:14

[1-12]\/[0-31] и [0-99] не имейте в виду 1 - 12, от 0 до 31 и от 0 до 99.

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

Так же для [0-99]. Выражение диапазона чисел с регулярными выражениями не легко.

Если числа не используют двузначные цифры (01/06/33), необходимо будет сделать что-то как: [0-9]{1,2} в течение дня и месяца, и [0-9]{2} в течение года или regex быстро станет громоздким. Это, конечно, рискует выбором чего-то как 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
ответ дан 4 August 2019 в 12:14

Даты хитры, но упрощение до подобной степени к Вашей попытке …

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

Объяснение

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

Больше комментариев

Обратите внимание, что это соответствует чему-то как 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
ответ дан 4 August 2019 в 12:14

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

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