Использование расширений параметров
Оболочка POSIX предоставляет расширения параметров для удаления substring
из string
, начинающегося слева (спереди) или справа (сзади) строки:
${string#substring} Strip shortest match of $substring from front of $string
${string##substring} Strip longest match of $substring from front of $string
${string%substring} Strip shortest match of $substring from back of $string
${string%%substring} Strip longest match of $substring from back of $string
Подстрока может содержать обычное глобирование файла, например, '*'
, '?'
, et c.
В вашем случае (с f='02-11-20 2:25 AM'
) вы можете удалить различные подстроки слева и справа, чтобы получить месяц, день и год. Затем вы можете умножить 2-ди git год на 100
, чтобы получить 4-ди git год следующим образом:
f='02-11-20 2:25 AM'
f="${f% *}" # trim AM (to first space) from right (back)
f="${f% *}" # trim 2:25 (to first space) from right
m="${f%%-*}" # trim to last - from right leaving month
y="${f##*-}" # trim to last - from left (front) leaving year
d="${f#*-}" # trim to first - from left leaving day-year
d="${d%-*}" # trim to first - from right leaving day
y=$((y*100)) # mulitply 2-digit year by 100
printf "%4d-%02d-%02d\n" "$y" "$m" "$d" # output in desired format
Используя expr substr string start length
POSIX также предоставляет старый набор expr ....
функций для работы со строками, хотя, поскольку заменяет команду , это, вероятно, будет медленнее, чем расширения встроенных параметров. Здесь уместно:
expr substr string start length
Извлечь символьную подстроку length
из string
, начиная с индекса (на основе 1) start
. Вы можете получить месяц, день и год, используя:
f='02-11-20 2:25 AM'
m=$(expr substr "$f" 1 2) # extract 2-digit substring at 1
d=$(expr substr "$f" 4 2) # extract 2-digit substring at 4
y=$(expr substr "$f" 7 2) # extract 2-digit substring at 7
y=$((y*100)) # mulitply 2-digit year by 100
printf "%4d-%02d-%02d\n" "$y" "$m" "$d" # output in desired format
( примечание: так же, как при использовании [...]
всегда заключайте в кавычки ваши переменные при использовании expr ...
)
Использование sed
Вы также можете использовать замену basi c sed
с тремя группами захвата и тремя обратными ссылками для повторной вставки компонентов даты в правильном порядке. Группы захвата \(text\)
захватывают текст между ними (представленный регулярным выражением text
), и в замещающей части выражения захваченный текст может быть повторно вставлен с использованием нумерованной обратной ссылки \1
для первый захват, \2
для второго и т. д., например:
f='02-11-20 2:25 AM'
echo "$f" | sed 's/^\(..\)-\(..\)-\(..\).*$/\300-\1-\2/'
Пример вывода
Оба подхода дают одинаковый вывод:
2000-02-11
Дайте мне знать, если у вас есть дополнительные вопросы.