Я интересуюсь изменением даты рождения в текстовом файле на другую дату от 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
Вы могли использовать ниже команды 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:
[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
).
Даты хитры, но упрощение до подобной степени к Вашей попытке …
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}
соответствуйте двум цифрам в течение года.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
.