Пакетное переименование определенного текста в имени папки

Ну, есть один случай, когда вам нужен редактор vi, допустим:

нет графического интерфейса, который вы используете в какой-то странной неизвестной системе *nix, ваш терминал выглядит так:

нет графического интерфейса

enter image description here

Как вы можете см. нет цифровой клавиатуры. Со старым vi (и я имею в виду оригинальные традиционные vi, а не vim, vim.tiny или vim.basic), вы можете редактировать файл с помощью этой клавиатуры. Без клавиш со стрелками? Да, когда вы находитесь в командном режиме, вы перемещаетесь через файл с h, j, k и l, как pro. h остался, j упал, k поднялся, и я был прав.

1
задан 6 January 2018 в 16:54

3 ответа

Вы можете сделать это с помощью rename:

$ rename -n 's/(?<![([])(\b\w)/uc($1)/eg' */
dogs bark - cats miaow [DBCM001]/ -> Dogs Bark - Cats Miaow [DBCM001]/
james peach - jack beanstalk [JPJB521]/ -> James Peach - Jack Beanstalk [JPJB521]/
small pond - big fish (revive) [FIN07CD]/ -> Small Pond - Big Fish (revive) [FIN07CD]/

-n делает rename печатать, что бы он сделал, ничего не делая. Удалите -n, как только вы убедитесь, что он работает так, как вы этого хотите.

s/from/to/ - это оператор подстановки и заменит from на to. Здесь я даю это:

(?<![([]): это называется негативным взглядом. Общий формат (?<!foo), а это означает «игнорировать любые совпадения, если предыдущее слово foo». Здесь я даю ему patern [([], это класс символов (определенный [ ]), состоящий из символов: [ и (. Таким образом, все это означает «игнорировать любые совпадения, которые появляются сразу после [ или (. [F19]: \b соответствует« границе слова ». Это якорь длиной 0, который соответствует точке переход между словом и не-словом. Так, например, он совпадает в начале строки или в пространстве или с любым другим символом, отличным от слова. \w, с другой стороны, соответствует (f22) соответствует первой букве слова. Скобки вокруг него «захватывают» его, поэтому мы можем ссылаться на него как $1 в правой части оператора замещения. uc($1): это мы заменим то, с чем мы сравнили. Как объяснялось выше, поскольку совпадение находится в круглых скобках, теперь мы можем ссылаться на него как $1. uc() - это функция Perl, которая делает вещи ВЕРХНИЙ СЛУЧАЙ. eg: это переключатели, влияющие на поведение s///. В частности, e позволяет выполнять команды с правой стороны, что позволяет нам использовать uc(), а g применяет замещение n глобально, ко всем совпадениям на линии.

Наконец, */ означает «запустить команду во всех каталогах в текущем каталоге».

Если вы также хотите использовать буквы в круглых скобках, вы можете использовать это вместо:

$ rename -n 's/(?<!\[)(\b\w)/uc($1)/eg' */
dogs bark - cats miaow [DBCM001] -> Dogs Bark - Cats Miaow [DBCM001]
james peach - jack beanstalk [JPJB521] -> James Peach - Jack Beanstalk [JPJB521]
small pond - big fish (revive) [FIN07CD] -> Small Pond - Big Fish (Revive) [FIN07CD]
2
ответ дан 22 May 2018 в 15:43
  • 1
    Слишком плохо, я , поэтому хотел использовать расширение параметра, например ${a^}, но это просто неприменимо без решения overkill здесь ... – dessert 6 January 2018 в 17:03
  • 2
    @dessert вот так? [F1] – terdon♦ 6 January 2018 в 17:07
  • 3
    В точку! По сравнению с опрятным решением rename, которое является излишним. – dessert 6 January 2018 в 18:03
  • 4
    @terdon Спасибо за быстрый ответ! Я дам ему попробовать ... Я вообще не сомневаюсь в правилах кода. Я уверен, что у меня есть bash, хотя ваша инструкция кажется довольно понятной. И да, текст без изменений в круглых скобках был преднамеренным. – user779373 6 January 2018 в 19:22
  • 5
    Это работает прелесть! Еще раз спасибо. – user779373 7 January 2018 в 16:55

Вы можете сделать это с помощью rename:

$ rename -n 's/(?<![([])(\b\w)/uc($1)/eg' */ dogs bark - cats miaow [DBCM001]/ -> Dogs Bark - Cats Miaow [DBCM001]/ james peach - jack beanstalk [JPJB521]/ -> James Peach - Jack Beanstalk [JPJB521]/ small pond - big fish (revive) [FIN07CD]/ -> Small Pond - Big Fish (revive) [FIN07CD]/

-n делает rename печатать, что бы он сделал, ничего не делая. Удалите -n, как только вы убедитесь, что он работает так, как вы этого хотите.

s/from/to/ - это оператор подстановки и заменит from на to. Здесь я даю это:

(?<![([]): это называется негативным взглядом. Общий формат (?<!foo), а это означает «игнорировать любые совпадения, если предыдущее слово foo». Здесь я даю ему patern [([], это класс символов (определенный [ ]), состоящий из символов: [ и (. Таким образом, все это означает «игнорировать любые совпадения, которые появляются сразу после [ или (. [F19]: \b соответствует« границе слова ». Это якорь длиной 0, который соответствует точке переход между словом и не-словом. Так, например, он совпадает в начале строки или в пространстве или с любым другим символом, отличным от слова. \w, с другой стороны, соответствует (f22) соответствует первой букве слова. Скобки вокруг него «захватывают» его, поэтому мы можем ссылаться на него как $1 в правой части оператора замещения. uc($1): это мы заменим то, с чем мы сравнили. Как объяснялось выше, поскольку совпадение находится в круглых скобках, теперь мы можем ссылаться на него как $1. uc() - это функция Perl, которая делает вещи ВЕРХНИЙ СЛУЧАЙ. eg: это переключатели, влияющие на поведение s///. В частности, e позволяет выполнять команды с правой стороны, что позволяет нам использовать uc(), а g применяет замещение n глобально, ко всем совпадениям на линии.

Наконец, */ означает «запустить команду во всех каталогах в текущем каталоге».

Если вы также хотите использовать буквы в круглых скобках, вы можете использовать это вместо:

$ rename -n 's/(?<!\[)(\b\w)/uc($1)/eg' */ dogs bark - cats miaow [DBCM001] -> Dogs Bark - Cats Miaow [DBCM001] james peach - jack beanstalk [JPJB521] -> James Peach - Jack Beanstalk [JPJB521] small pond - big fish (revive) [FIN07CD] -> Small Pond - Big Fish (Revive) [FIN07CD]
2
ответ дан 17 July 2018 в 23:44

Вы можете сделать это с помощью rename:

$ rename -n 's/(?<![([])(\b\w)/uc($1)/eg' */ dogs bark - cats miaow [DBCM001]/ -> Dogs Bark - Cats Miaow [DBCM001]/ james peach - jack beanstalk [JPJB521]/ -> James Peach - Jack Beanstalk [JPJB521]/ small pond - big fish (revive) [FIN07CD]/ -> Small Pond - Big Fish (revive) [FIN07CD]/

-n делает rename печатать, что бы он сделал, ничего не делая. Удалите -n, как только вы убедитесь, что он работает так, как вы этого хотите.

s/from/to/ - это оператор подстановки и заменит from на to. Здесь я даю это:

(?<![([]): это называется негативным взглядом. Общий формат (?<!foo), а это означает «игнорировать любые совпадения, если предыдущее слово foo». Здесь я даю ему patern [([], это класс символов (определенный [ ]), состоящий из символов: [ и (. Таким образом, все это означает «игнорировать любые совпадения, которые появляются сразу после [ или (. [F19]: \b соответствует« границе слова ». Это якорь длиной 0, который соответствует точке переход между словом и не-словом. Так, например, он совпадает в начале строки или в пространстве или с любым другим символом, отличным от слова. \w, с другой стороны, соответствует (f22) соответствует первой букве слова. Скобки вокруг него «захватывают» его, поэтому мы можем ссылаться на него как $1 в правой части оператора замещения. uc($1): это мы заменим то, с чем мы сравнили. Как объяснялось выше, поскольку совпадение находится в круглых скобках, теперь мы можем ссылаться на него как $1. uc() - это функция Perl, которая делает вещи ВЕРХНИЙ СЛУЧАЙ. eg: это переключатели, влияющие на поведение s///. В частности, e позволяет выполнять команды с правой стороны, что позволяет нам использовать uc(), а g применяет замещение n глобально, ко всем совпадениям на линии.

Наконец, */ означает «запустить команду во всех каталогах в текущем каталоге».

Если вы также хотите использовать буквы в круглых скобках, вы можете использовать это вместо:

$ rename -n 's/(?<!\[)(\b\w)/uc($1)/eg' */ dogs bark - cats miaow [DBCM001] -> Dogs Bark - Cats Miaow [DBCM001] james peach - jack beanstalk [JPJB521] -> James Peach - Jack Beanstalk [JPJB521] small pond - big fish (revive) [FIN07CD] -> Small Pond - Big Fish (Revive) [FIN07CD]
2
ответ дан 24 July 2018 в 17:05

Другие вопросы по тегам:

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