Изменить строку с помощью sed или awk - PullRequest
0 голосов
/ 27 апреля 2019

У меня есть некоторые файлы, которые имеют неправильные время и дату, но имя файла содержит правильные время и дату, и я пытаюсь написать скрипт, чтобы исправить это с помощью сенсорной команды.

Пример имени файла: 071212_090537.jpg

Я хотел бы, чтобы это было преобразовано в следующий формат: 1712120905.37

Обратите внимание, год указан в имени файла как 07, даже если это 17, поэтому я хотел бы первый 0быть измененным на 1.

Как я могу сделать это, используя awk или sed?

Я совершенно новичок в awk и sed, программировании в целом.Попытка найти решение и инструкцию, но не удалось выяснить, как решить эту проблему.

Кто-нибудь может мне помочь?

Спасибо.:)

Ответы [ 3 ]

0 голосов
/ 28 апреля 2019

Для этого совершенно не нужно вызывать awk или sed, вы можете сделать это в своей оболочке.например, с помощью bash:

$ f='071212_090537.jpg'
$ [[ $f =~ ^.(.*)_(.*)(..)\.[^.]+$ ]]
$ echo "1${BASH_REMATCH[1]}${BASH_REMATCH[2]}.${BASH_REMATCH[3]}"
1712120905.37

Это, вероятно, то, что вы пытаетесь сделать:

for old in *.jpg; do
    [[ $old =~ ^.(.*)_(.*)(..)\.[^.]+$ ]] || { printf 'Warning, unexpected old file name format "%s"\n' "$old" >&2; continue; }
    new="1${BASH_REMATCH[1]}${BASH_REMATCH[2]}.${BASH_REMATCH[3]}"
    [[ -f "$new" ]] && { printf 'Warning, new file name "%s" generated from "%s" already exists, skipping.\n' "$new" "$old" >&2; continue; }
    mv -- "$old" "$new"
done

Вам нужен этот тест для нового, уже существующего, начиная со старого 071212_090537.jpg или 171212_090537.jpg (или различные другие значения) создаст такой же новый из 1712120905.37

0 голосов
/ 28 апреля 2019

Я думаю, что sed действительно самое простое решение:

Вы можете сделать это:

▶ for f in *.jpg ; do
  new_f=$(sed -E 's/([0-9]{6})_([0-9]{4})([0-9]{2})\.jpg/\1\2.\3.jpg/' <<< $f)
  mv $f $new_f
done

Для получения дополнительной информации:

  • Возможно, вам необходимо прочитать вводное руководство по регулярным выражениям.

  • Обратите внимание, что опция -E для sed позволяет использовать расширенные регулярные выражения, что позволяет получить более удобочитаемое и удобное выражение здесь.

  • Использование <<< - это Bashism, известный как "here-string". Если вы используете оболочку, которая не поддерживает это, A <<< $b можно переписать как echo $b | A.

Тестирование:

▶ touch 071212_090538.jpg 071212_090539.jpg                                                                                                                                                           
▶ ls -1 *.jpg
071212_090538.jpg
071212_090539.jpg
▶ for f in *.jpg ; do
  new_f=$(sed -E 's/([0-9]{6})_([0-9]{4})([0-9]{2})\.jpg/\1\2.\3.jpg/' <<< $f)
  mv $f $new_f
done
▶ ls -1
0712120905.38.jpg
0712120905.39.jpg
0 голосов
/ 27 апреля 2019

Возьмите пример:

awk -F'[_.]' '{$0=$1$2;sub(/^./,"1");sub(/..$/,".&")}1'<<<"071212_090537.jpg"

выведет:

1712120905.37

Если вы хотите, чтобы файл был удален, вы можете позволить awk сгенерировать команду mv origin new и pipeвывод в |sh, например: (встроенные комментарии)

listYourFiles|    # list your files as input to awk

       awk -F'[_.]' '{o=$0;$0=$1$2;sub(/^./,"1");sub(/..$/,".&");
                      printf "mv %s %s\n",o,$0 }1' #this will print "mv ori new"

             |sh     # this will execute the mv command
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...