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 но я не знаю, как это сделать а.) без замены каждого «-» на «:» и б.) взяв символы, на которые ссылается «?»и сохранить их. Мои усилия до сих пор привели к тому, что двоеточия заменили все дефисы, или с каждой последовательностью [двоеточие] [число] [число], приводящей к «:??» печатается буквально.

Может кто-нибудь объяснить мне, как это сделать, или указать мне документацию, которая объясняет, как ссылаться на совпавшие символы, чтобы использовать их в замене?

Кроме того, вы можете сказать мне, какой синтаксис мне нужно добавить, если я хочу сделать это рекурсивно?

2 ответа2

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .