Виникають проблеми із заміною певного дефісу в каталогах, які мають певний формат у Bash


1

У мене є список каталогів у форматі:

2014-12-03 13-03
2014-09-03 12-07

і т.д.

Мені потрібно змінити їх на:

2014-12-03 13:03
2014-09-03 12:07

Я намагаюся це зробити for d in *\ ??-??; do mv "$d" "$d//<something>/<something>"; done але я не знаю, як це зробити a.) без заміни кожного “-” з “:” та b.) беручи символи, на які посилаються? та зберігаючи їх. Мої зусилля до цих пір призвели до того, що двокрапки замінили всі дефіси, або з кожною серією [двокрапкою] [числом] [числом], в результаті чого буквально надруковано ": ??"

Може хто-небудь пояснити мені, як це зробити, або вкажіть мені документацію, яка пояснює, як посилатися на знайдені символи, щоб використовувати їх у заміну?

Крім того, ви можете також сказати мені, який синтаксис мені потрібно додати, якщо я хочу це зробити рекурсивно?


Яку операційну систему?
DavidPostill

Уф, вибачте, що я покинув це. Змінено назву для включення цієї інформації. Я намагаюся зробити це в Bash. Зокрема, Debian 7, хоча я сумніваюся, що ця частина є важливою. Дякую.
rrr45

Відповіді:


0

Я не думаю, що ви можете зробити це з розширенням параметрів bash, але ось один із способів:

$ d="2014-12-03 13-03"
$ new=$(sed -r 's/-([^-]+)$/:\1/' <<< "$d")
$ echo "$new"
2014-12-03 13:03

Просто з bash, використовуючи регулярні вирази та захоплюючи:

$ [[ $d =~ (.*)\ (..)-(..)$ ]] &&  printf -v new "%s %s:%s" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
$ echo "$new"
2014-12-03 13:03

0

Інший спосіб:

find . -type d -name "2014*" -print0 | while read -d $'\0' file
do
    mv "$file" "$(echo $file | sed -r s/\(.*\)-\([^-]+\)$/\\1:\\2/g)"
done
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.