find -execdir rename
Это переименовывает файлы и каталоги с регулярным выражением, влияющим только на базовые имена.
Так что для префикса вы можете сделать:
PATH=/usr/bin find. -depth -execdir rename 's/(.*)/\L$1/' '{}' \;
или только для файлов:
PATH=/usr/bin find. -type f -execdir rename 's/(.*)/\L$1/' '{}' \;
-execdir
сначала cd
s в каталог перед выполнением только для базового имени.
Я объяснил это более подробно в:https://stackoverflow.com/questions/16541582/find-multiple-files-and-rename-them-in-linux/54163971#54163971
Сначала вы можете упростить свою команду, найдя некоторый шаблон, уникальный для линии. В следующем примере мы предполагаем, что точка с запятой -двоеточие ;
уникальна (по крайней мере в вашем образце текста )для строки, которая должна быть проанализированаsed
:
# capture the last 4 digits of the line and substitute them in reverse order
$ sed '/;/s/\(.\)\(.\)\(.\)\(.\)$/\4\3\2\1/'
ABC Corp
1234 7 Oaks Lane
Denton; TX 76509-1234
(682) 543-7890
Аналогично другому ответу ,но используя Perl:
$ perl -lp -e '/;/ && s/(?<=-)\d{4}/reverse $&/e' <file
ABC Corp
1234 7 Oaks Lane
Denton; TX 76509-1234
(682) 543-7890
Это находит строки, содержащие символ ;
, и переворачивает четыре цифры после дефиса в этой строке.
Обращение числа выполняется с помощью функции Perl reverse
.
Другой sed
альтернативный вариант, который также позволяет инвертировать цифры любой длины:
sed -E ':a 3s/-([0-9]+)([0-9])$/-\2-\1/; ta;
:b 3s/-([0-9])-([0-9]+)$/-\1\2/; tb'