Манипулирование именами файлов - PullRequest
0 голосов
/ 13 мая 2019

Пожалуйста, помогите мне с помощью сценария Unix изменить имя файла в требуемом формате, как показано ниже:

AN_555a_orange_20190513.txt    
AN_555b_apple_20190513.txt 

Обязательный формат: первый символ имени фрукта должен быть в заглавных буквах, а также его позиция должна быть изменена навторое:

AN_Orange_555a_20190513.txt     
AN_Apple_555a_20190513.txt

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

for in in aaal*
  do
      out=${in#*_}
      out=${out%_*_*_*}
      out=${out%[0-9]}
      out1=${out#*_}
      out2=${out%_*}
      AAAI_$out1$out2.txt
  done

Ответы [ 3 ]

0 голосов
/ 13 мая 2019

Интересным решением для этого случая является использование sed, вот так:

$ ls -1 | sed 's/\(AN_\)\([^_]*_\)\([a-z]*_\)\([0-9]*.txt\)/mv "&" "\1\u\3\2\4"/e'

Обратите внимание на последний e в конце команды sed. Он говорит sed выполнить результат подстановки как команду bash.

Таким образом, если вы удалите e (что вы могли бы сделать сначала, чтобы проверить правильность подстановки), вы получите в консоли:

$ ls -1 | sed 's/\(AN_\)\([^_]*_\)\([a-z]*_\)\([0-9]*.txt\)/mv "&" "\1\u\3\2\4"/'
mv "AN_555a_orange_20190513.txt" "AN_Orange_555a_20190513.txt"
mv "AN_555b_apple_20190513.txt" "AN_Apple_555b_20190513.txt"

(Подстановка sed соответствует нескольким группам символов, переупорядочивает их и создает строку mv ... .... Обратите внимание, что & в шаблоне замены обозначает весь соответствующий шаблон, а \u сообщает sed поставить следующий символ в верхнем регистре.)

Затем добавьте обратно этот окончательный e, и вместо печати этих строк sed будет выполнять их, эффективно переименовывая файлы.

0 голосов
/ 13 мая 2019

Этот лайнер может дать вам больше ид:

awk -F_ '{printf "mv %s %s_%s%s_%s_%s\n", $0, $1,toupper(substr($3,1,1)), substr($3, 2),$2,$4}' <(ls *.txt) 

Это напечатает что-то вроде:

mv AN_555a_orange_20190513.txt AN_Orange_555a_20190513.txt
mv AN_555b_apple_20190513.txt AN_Apple_555b_20190513.txt

Тогда, если вас устраивают результаты, направьте его на sh, например:

awk -F_ '{printf "mv %s %s_%s%s_%s_%s\n", $0, $1,toupper(substr($3,1,1)), substr($3, 2),$2,$4}' <(ls *.txt)  | sh
0 голосов
/ 13 мая 2019

Этот скрипт прост, но работает с вашим примером:

#!/bin/bash
for i in AN*; do
  NAME=$(echo $i | awk -F_ '{printf "%s_%s%s_%s_%s", $1,toupper( substr( $3,1,1)),(substr($3,2,100)),$2,$4,$5}')
  echo "--> $NAME"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...