команда rename с выражением perl

Я могу использовать следующую команду успешно, и я вполне уверен в этой команде, чтобы сделать другие комбинации:

`rename 's/\.htm/\.html/' *.htm`

Однако я хочу узнать об этом больше, особенно о s в Это. Говорят, что это выражение Perl. Я не изучил язык программирования Perl, поэтому я понятия не имею, почему существует такой аргумент 's/\.htm/\.html/'. Не могли бы вы сказать мне, что это такое? Спасибо за чтение.

5
задан 1 December 2017 в 19:01

3 ответа

Обычно rename переименовывает имена файлов, предоставленные в соответствии с правилом, указанным в качестве первого аргумента команды. Имена файлов снабжаются аргументами, которые следуют за первым.

Первый аргумент в команде примера (rename 's/\.htm/\.html/' *.htm) содержит части меха, где в этом случае / является разделителем этих частей :

s/regexp/replacement/[flags]
Команда s означает замену: s/<old>/<new>/. Сопоставьте регулярное выражение с содержимым пространства шаблонов. Если найдено, замените строку с заменой на замену. Регулярное выражение, которое соответствует строкам, которые необходимо заменить. В текущем случае это только строка .htm. В большинстве регулярных выражений точка . соответствует каждому символу. В этом случае мы хотим использовать точку буквально, поэтому нам нужно избегать ее специального значения, используя обратную косую черту \ (со ссылкой на один символ). Замена sting / regexp соответствует 2. Флаг, который не представлен в текущем примере. Это может быть, например, флаг g - применить замену ко всем совпадениям к регулярному выражению, а не только к первому. Предположим, у нас есть файл с именем my.htm-file.htm: оригинальная команда rename 's/\.htm/\.html/' *.htm переименует файл таким образом: my.html-file.htm. Посмотрите на нижнюю часть ответа, как избежать этой проблемы. Добавив флаг g - rename 's/\.htm/\.html/g' *.htm - новое имя файла будет: my.html-file.html.

В соответствии с именами файлов: * может представлять любое количество символов (включая ноль, другими словами, ноль или более символов). Оболочка будет rename и передает соответствующие имена файлов в виде отдельных аргументов в rename. Таким образом, *.htm - будет соответствовать всем именам файлов в текущем пути, которые заканчиваются строкой .htm. Например, если у вас есть 1.htm, 2.htm, 3.htm, 4.htm и 5.htm, то rename 's/\.htm/\.html/' *.htm передает точно те же аргументы, что и для переименования:

rename 's/\.htm/\.html/' 1.htm 2.htm 3.htm 4.htm 5.htm
[ ! d23]

Вся команда (rename 's/\.htm/\.html/' *.htm) может быть прочитана следующим образом:

rename `<substitute>/<the string ".htm">/<with the string ".html">/` <do it for all files in the current path that end with ".htm">

Вернемся к примеру, когда у нас есть файл с именем [F31]. Возможно, мы хотим изменить последнюю часть имени файла так называемого расширения после последней точки. Для этого мы должны изменить команду rename следующим образом:

rename 's/\.htm$/\.html/' *.htm

Где знак $ соответствует концу строки и буквально означает «читать назад».

^ - Соответствует нулевой строке в начале пространства шаблонов, то есть то, что появляется после того, как circumflex должен появиться в начале пространства шаблонов. (подробнее) ^ действует как специальный символ только в начале регулярного выражения или подвыражения (то есть после \( или \|). Переносимые скрипты должны избегать ^ в начале подвыражения, хотя, поскольку POSIX разрешает реализации, которые рассматривают ^ как обычный символ в этом контексте. $ - То же, что и ^, но относится к концу пространства шаблонов. $ также действует как специальный символ только в конце регулярного выражения или подвыражения (то есть до \) или \|), а его использование в конце подвыражения не переносимо.

Ссылки:

Руководство Bash для начинающих: расширение оболочки GNU / Linux. Инструменты командной строки. Сводка: Wildcards perlre - регулярные выражения Perl. GNU: sed, a редактор потока Онлайн-тестеры регулярных выражений
4
ответ дан 22 May 2018 в 15:45
  • 1
    s для замены. Хорошо. Спасибо за Ваш ответ. Многие люди извлекут выгоду из вашего ответа. Хорошего дня:) – Smile 1 December 2017 в 15:16
  • 2
    "второй аргумент, то есть выражение соответствия имени файла" Нет, rename никогда не видит *.htm. Перед запуском rename оболочка расширяет этот glob и передает соответствующие имена файлов в качестве отдельных аргументов в rename. Если у вас есть 1.htm, 2.htm, 3.htm, 4.htm и 5.htm, то rename 's/\.htm/\.html/' *.htm передает точно те же аргументы, что и rename, как rename 's/\.htm/\.html/' 1.htm 2.htm 3.htm 4.htm 5.htm. Готовы ли вы отредактировать или принять изменение - чтобы исправить это? Этот ответ в остальном хорош. – Eliah Kagan 1 December 2017 в 16:55
  • 3
    @EliahKagan: Спасибо за эту заметку! Я сделал редактирование. – pa4080 1 December 2017 в 17:27

Обычно rename переименовывает имена файлов, предоставленные в соответствии с правилом, указанным в качестве первого аргумента команды. Имена файлов снабжаются аргументами, которые следуют за первым.

Первый аргумент в команде примера (rename 's/\.htm/\.html/' *.htm) содержит части меха, где в этом случае / является разделителем этих частей :

s/regexp/replacement/[flags] Команда s означает замену: s/<old>/<new>/. Сопоставьте регулярное выражение с содержимым пространства шаблонов. Если найдено, замените строку с заменой на замену. Регулярное выражение, которое соответствует строкам, которые необходимо заменить. В текущем случае это только строка .htm. В большинстве регулярных выражений точка . соответствует каждому символу. В этом случае мы хотим использовать точку буквально, поэтому нам нужно избегать ее специального значения, используя обратную косую черту \ (со ссылкой на один символ). Замена sting / regexp соответствует 2. Флаг, который не представлен в текущем примере. Это может быть, например, флаг g - применить замену ко всем совпадениям к регулярному выражению, а не только к первому. Предположим, у нас есть файл с именем my.htm-file.htm: оригинальная команда rename 's/\.htm/\.html/' *.htm переименует файл таким образом: my.html-file.htm. Посмотрите на нижнюю часть ответа, как избежать этой проблемы. Добавив флаг g - rename 's/\.htm/\.html/g' *.htm - новое имя файла будет: my.html-file.html.

В соответствии с именами файлов: * может представлять любое количество символов (включая ноль, другими словами, ноль или более символов). Оболочка будет rename и передает соответствующие имена файлов в виде отдельных аргументов в rename. Таким образом, *.htm - будет соответствовать всем именам файлов в текущем пути, которые заканчиваются строкой .htm. Например, если у вас есть 1.htm, 2.htm, 3.htm, 4.htm и 5.htm, то rename 's/\.htm/\.html/' *.htm передает точно те же аргументы, что и для переименования:

rename 's/\.htm/\.html/' 1.htm 2.htm 3.htm 4.htm 5.htm [ ! d23]

Вся команда (rename 's/\.htm/\.html/' *.htm) может быть прочитана следующим образом:

rename `<substitute>/<the string ".htm">/<with the string ".html">/` <do it for all files in the current path that end with ".htm">

Вернемся к примеру, когда у нас есть файл с именем [F31]. Возможно, мы хотим изменить последнюю часть имени файла так называемого расширения после последней точки. Для этого мы должны изменить команду rename следующим образом:

rename 's/\.htm$/\.html/' *.htm

Где знак $ соответствует концу строки и буквально означает «читать назад».

^ - Соответствует нулевой строке в начале пространства шаблонов, то есть то, что появляется после того, как circumflex должен появиться в начале пространства шаблонов. (подробнее) ^ действует как специальный символ только в начале регулярного выражения или подвыражения (то есть после \( или \|). Переносимые скрипты должны избегать ^ в начале подвыражения, хотя, поскольку POSIX разрешает реализации, которые рассматривают ^ как обычный символ в этом контексте. $ - То же, что и ^, но относится к концу пространства шаблонов. $ также действует как специальный символ только в конце регулярного выражения или подвыражения (то есть до \) или \|), а его использование в конце подвыражения не переносимо.

Ссылки:

Руководство Bash для начинающих: расширение оболочки GNU / Linux. Средства командной строки. Сводка: Wildcards perlre - регулярные выражения Perl. GNU: sed, a редактор потока Онлайн-тестеры регулярных выражений
4
ответ дан 18 July 2018 в 02:15

Обычно rename переименовывает имена файлов, предоставленные в соответствии с правилом, указанным в качестве первого аргумента команды. Имена файлов снабжаются аргументами, которые следуют за первым.

Первый аргумент в команде примера (rename 's/\.htm/\.html/' *.htm) содержит части меха, где в этом случае / является разделителем этих частей :

s/regexp/replacement/[flags] Команда s означает замену: s/<old>/<new>/. Сопоставьте регулярное выражение с содержимым пространства шаблонов. Если найдено, замените строку с заменой на замену. Регулярное выражение, которое соответствует строкам, которые необходимо заменить. В текущем случае это только строка .htm. В большинстве регулярных выражений точка . соответствует каждому символу. В этом случае мы хотим использовать точку буквально, поэтому нам нужно избегать ее специального значения, используя обратную косую черту \ (со ссылкой на один символ). Замена sting / regexp соответствует 2. Флаг, который не представлен в текущем примере. Это может быть, например, флаг g - применить замену ко всем совпадениям к регулярному выражению, а не только к первому. Предположим, у нас есть файл с именем my.htm-file.htm: оригинальная команда rename 's/\.htm/\.html/' *.htm переименует файл таким образом: my.html-file.htm. Посмотрите на нижнюю часть ответа, как избежать этой проблемы. Добавив флаг g - rename 's/\.htm/\.html/g' *.htm - новое имя файла будет: my.html-file.html.

В соответствии с именами файлов: * может представлять любое количество символов (включая ноль, другими словами, ноль или более символов). Оболочка будет rename и передает соответствующие имена файлов в виде отдельных аргументов в rename. Таким образом, *.htm - будет соответствовать всем именам файлов в текущем пути, которые заканчиваются строкой .htm. Например, если у вас есть 1.htm, 2.htm, 3.htm, 4.htm и 5.htm, то rename 's/\.htm/\.html/' *.htm передает точно те же аргументы, что и для переименования:

rename 's/\.htm/\.html/' 1.htm 2.htm 3.htm 4.htm 5.htm [ ! d23]

Вся команда (rename 's/\.htm/\.html/' *.htm) может быть прочитана следующим образом:

rename `<substitute>/<the string ".htm">/<with the string ".html">/` <do it for all files in the current path that end with ".htm">

Вернемся к примеру, когда у нас есть файл с именем [F31]. Возможно, мы хотим изменить последнюю часть имени файла так называемого расширения после последней точки. Для этого мы должны изменить команду rename следующим образом:

rename 's/\.htm$/\.html/' *.htm

Где знак $ соответствует концу строки и буквально означает «читать назад».

^ - Соответствует нулевой строке в начале пространства шаблонов, то есть то, что появляется после того, как circumflex должен появиться в начале пространства шаблонов. (подробнее) ^ действует как специальный символ только в начале регулярного выражения или подвыражения (то есть после \( или \|). Переносимые скрипты должны избегать ^ в начале подвыражения, хотя, поскольку POSIX разрешает реализации, которые рассматривают ^ как обычный символ в этом контексте. $ - То же, что и ^, но относится к концу пространства шаблонов. $ также действует как специальный символ только в конце регулярного выражения или подвыражения (то есть до \) или \|), а его использование в конце подвыражения не переносимо.

Ссылки:

Руководство Bash для начинающих: расширение оболочки GNU / Linux. Средства командной строки. Сводка: Wildcards perlre - регулярные выражения Perl. GNU: sed, a редактор потока Онлайн-тестеры регулярных выражений
5
ответ дан 24 July 2018 в 17:30

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

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