переименовать команду с выражением perl

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

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

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

7
задан 1 December 2017 в 18:01

1 ответ

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

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

s/regexp/replacement/[flags]
  1. s команда означает замену: s/<old>/<new>/. Сопоставьте регулярное выражение с содержимым пространства шаблона. Если найдено, замените соответствующую строку заменой.

  2. Регулярное выражение, соответствующее строкам, которые следует заменить. В текущем случае это просто строка .htm.

    В большинстве регулярных выражений точка . соответствует каждому символу. В этом случае мы хотим использовать точку буквально, поэтому нам нужно избежать ее особого значения, используя обратную косую черту \ (цитируя один символ).

  3. Замена sting / regexp соответствует 2.

  4. Флаг, который не представлен в текущем примере. Это может быть, например, флаг 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. Таким образом, *.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

Всю команду (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">

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

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

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

^ - Сопоставляет пустую строку в начале пространства шаблона, то есть то, что появляется после огибающей, должно появляться в начале пространства шаблона. ( читать больше )

^ действует как специальный символ только в начале регулярного выражения или подвыражения (то есть после \( или \|). Однако переносимые сценарии должны избегать ^ в начале подвыражения, поскольку POSIX допускает реализации, которые рассматривают ^ как обычный символ в этом контексте.

$ - Это то же самое, что и ^, но относится к концу пространства шаблона. $ также действует как специальный символ только в конце регулярного выражения или подвыражения (то есть до \) или \|), и его использование в конце подвыражения не переносимо.


Ссылки:

7
ответ дан 1 December 2017 в 18:01

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

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