С точки зрения того, что вы делаете неправильно, ваша первая sed
строфа будет работать только с датой, которой предшествует символ , а не цифра. Это означает, что он не будет работать с датами в начале строки, так как перед ним нет символа.
См. Следующую стенограмму:
pax$ echo "1/1/2001 1/1/2001" | sed -e 'sx\([^0-9]\)\([0-9]/\)x\10\2xg' -e 'sx/\([0-9]/\)x/0\1xg'
1/01/2001 01/01/2001
pax$ echo "_1/1/2001 1/1/2001" | sed -e 'sx\([^0-9]\)\([0-9]/\)x\10\2xg' -e 'sx/\([0-9]/\)x/0\1xg'
_01/01/2001 01/01/2001
Вы видите, что первая дата не изменяется правильно в первой команде, но изменяется во второй, потому что перед ней стоит символ.
Быстрое решение этой проблемы - просто добавить еще одно предложение для обработки этого случая начала строки:
-e 'sx^\([0-9]/\)x0\1xg'
Вы также можете переключиться на расширенные регулярные выражения, если ваш sed
поддерживает это, и изменить первый раздел для обработки обоих случаев (незначный или начальный якорь):
pax$ echo "1/1/2001 1/1/2001" | sed -r -e 'sx([^0-9]|^)([0-9]/)x\10\2xg' -e 'sx/([0-9]/)x/0\1xg'
01/01/2001 01/01/2001
Это также позволяет вам избавиться от некоторых из этих уродливых обратных косых черт: -)
Конечно, если все ваши даты находятся в начале строки, или у вас есть одна дата в начале строки в однострочном файле (ваш первый абзац кажется , чтобы подразумевать это), становится лот проще:
pax$ echo "1/1/2001" | awk -F/ '{printf "%02d/%02d/%04d\n", $1, $2, $3}'
01/01/2001