sed :реверсивная замена шаблона

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сначала cds в каталог перед выполнением только для базового имени.

Я объяснил это более подробно в:https://stackoverflow.com/questions/16541582/find-multiple-files-and-rename-them-in-linux/54163971#54163971

3
11.02.2021, 00:32
3 ответа

Сначала вы можете упростить свою команду, найдя некоторый шаблон, уникальный для линии. В следующем примере мы предполагаем, что точка с запятой -двоеточие ;уникальна (по крайней мере в вашем образце текста )для строки, которая должна быть проанализирована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
4
18.03.2021, 22:31

Аналогично другому ответу ,но используя 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.

3
18.03.2021, 22:31

Другой sedальтернативный вариант, который также позволяет инвертировать цифры любой длины:

sed -E ':a 3s/-([0-9]+)([0-9])$/-\2-\1/; ta;
        :b 3s/-([0-9])-([0-9]+)$/-\1\2/; tb'
2
18.03.2021, 22:31

Теги

Похожие вопросы