Переименовать - что означает «s //» против «y //»?

9

Страница man дает два примера:

rename 's/\.bak$//' *.bak
rename 'y/A-Z/a-z/' *

Так что это либо с или у, а затем /replaceThis/withThis

Что означают ведущие s и y? Есть ли другие варианты?

Дэн Гибсон
источник

Ответы:

12

В первом случае:

rename 's/\.bak$//' *.bak

вы запускаете регулярное выражение для имен файлов и заменяете соответствующую часть выражений (.bak в конце имени файла) вторым выражением (которое пусто).

Во втором случае:

rename 'y/A-Z/a-z/' *

вы сравниваете с шаблоном регулярного выражения и транслитерируете к цели. Другими словами, диапазон AZ изменяется на диапазон az, делая имена файлов строчными.

Я предлагаю вам взглянуть на man-страницу для sed, чтобы узнать больше команд и подробностей. Я считаю, что команда 's' используется чаще всего. Кроме того, регулярное выражение (раздел 7) и документация на Perl также могут помочь. В частности, вот учебник по Perl и регулярным выражениям.


От man sed:

s / регулярное выражение / замена /    
       Попытайтесь сопоставить регулярное выражение с пространством шаблона. Если успех
       Замените ту часть, которая соответствует замене. 
       замена может содержать специальный символ и ссылаться на это
       часть шаблонного пространства, которое соответствует, и специальный
       экранирует от \ 1 до \ 9 для ссылки на соответствующее совпадение
       подвыражения в регулярном выражении.

г / источник / приемник /  
       Транслитерировать символы в шаблонном пространстве, которые появляются
       в источнике к соответствующему символу в dest.
Джон С. Грубер
источник
Большое спасибо - я просто не уверен, что указывать людей на sed - это лучшая идея, учитывая ее множество реализаций, особенно между любым конкретным дистрибутивом Linux и OSX
aaaaaa
@aaaaaa Этот сайт посвящен исключительно Ubuntu.
wjandrea