В чем разница между `r`n и` n для разрывов строк в Powershell? - PullRequest
3 голосов
/ 01 апреля 2020

Я знаю, что в windows и unix есть разные коды разрыва строки. Но в Powershell и `r`n, и `n работают на разрыв строки. Есть ли автоматическое c преобразование из `n в `r`n и почему вы должны использовать кавычки вместо обратной косой черты?

Ответы [ 3 ]

1 голос
/ 01 апреля 2020
  • Вкл. ввод , PowerShell принимает `r`n (Windows в стиле) и `n (Unix в стиле) и новые строки взаимозаменяемо , независимо от платформы (ОС), на которой он работает; это относится как к чтению файлов исходного кода PowerShell (например, сценариев *.ps1), так и ко всем встроенным командлетам, которые читают текст, в частности Get-Content.

    • `n - это LF, LINE FEED, U+000A символ, используемый сам по себе в качестве новой строки на Unix -подобных платформах .
    • `r`n - это CRLF, символ новой строки sequence , состоящий из символа ВОЗВРАТ ЗАРЯДА (U+000D), за которым сразу следует LF, используемый как символ новой строки в Windows.

    • ` используется выше, потому что это `, backtick (формально известный как GRAVE ACCENT, U+0060) , который служит экранирующим символом в PowerShel l, в отличие от многих других языков, где он равен \ ( например, `n в PowerShell соответствует \n в C# и JavaScript, а `r`n - \r\n.

      • ` служит в качестве escape символ в PowerShell:

        • внутри расширяемые строки ("..."; но не внутри '...', чье содержимое используется дословно ) нет
        • в без кавычек аргументы, передаваемые командам, где его основное назначение экранировать метасимволы (такие символы, как ;, которые имеют функцию syntacti c), т.е. использовать их дословно ; например, Write-Host a`;b)
        • См. концептуальные about_Special_Characters help topi c для получения дополнительной информации и список поддерживаемых escape-последовательностей .
      • Обратите внимание, что в контекстах regex (например, с помощью операторов -match и -replace), escape-последовательности на основе \ (например, \n) могут все еще входят в игру, а именно, когда эти escape-последовательности интерпретируются механизмом регулярных выражений . NET , а не самим PowerShell (например, "a`nb" -replace '\n' приводит к 'ab'); см. концептуальные about_Regular_Expressions справки topi c.

  • Вкл. вывод , PowerShell использует нативную последовательность новой строки: `r`n на Windows, `n на Unix -подобных платформах.

    • Это относится к использованию командлетов для создания текстовых файлов , которые включают:

      • Командлеты для простого текста создания файлов: Set-Content и Out-File / оператор перенаправления >.
      • Командлеты, которые создают структурированный текст файлы, такие как Export-Csv.
    • As кроме:

      • В PowerShell [Core] 6 + , последовательно используемая кодировка символов при создании (и чтении) текстовых файлов UTF-8 без a Спецификация .

      • В отличие от Windows PowerShell (Версии PowerShell до 5.1), кодировки по умолчанию различаются в зависимости от командлета и при выборе UTF-8 с помощью параметра -Encoding выходного командлета неизменно создается файл с спецификацией.

      • Для получения дополнительной информации о (по умолчанию) кодировках символов в Windows PowerShell против PowerShell [Core], см. этот ответ .


Что касается ваш Speci c Вопросы :

Есть ли Автомат c преобразование из `n в `r`n?

В некотором смысле, да:

При сохранении в файл с помощью командлета создания текстового файла неявно используется платформа-нативная последовательность новой строки , как обсуждалось выше.

Следовательно, чтение a с Get-Content (которое по умолчанию читает строку строка за строкой ) и сохранение этих строк обратно в файл с Set-Content эффективно приведет к преобразованию исходных символов новой строки в нативные переводы платформы, если они исходят из соответствующего другого мира.

Обратите внимание, что, отдельно, кодировка символов может измениться , потому что когда строки считываются в память , информация о кодировке символов входного файла теряется, и командлеты, создающие текстовые файлы, такие как Set-Content, применяют кодировку по умолчанию к выходным данным - см. этот ответ для фона информация.

Целевое преобразование в специфицированный c стиль новой строки, независимо от того, на какой платформе вы работаете , требует дополнительной работы.

почему вы должны использовать обратные косые черты (`) вместо обратной косой черты (\)?

* 12 45 *\, поскольку escape-символ был бы плохим выбором для PowerShell, потому что \ используется в путях к файлам , учитывая, что \ служит (основным) разделитель пути к файловой системе в Windows, и учитывая, что передача путей к файлам в качестве аргументов является очень распространенным случаем в оболочках.

Необходимость \ - убрать эти разделители путей для устранения их неоднозначности начиная с \, поскольку экранирующий символ (например, "C:\\Program Files\\PowerShell" вместо "C:\Program Files\PowerShell") был бы неоправданным бременем (такое экранирование достаточно раздражает в таких языках программирования, как C# и JavaScript, хотя последние версии теперь предлагают альтернативные синтаксические формы, в которых экранирование не требуется).

Следовательно, PowerShell требовался другой escape-символ, и он установлен на `, потому что:

  • редко в буквальном использовании; то есть вам редко придется самому бежать ` - как `` - чтобы использовать его дословно .

  • хотя бы на английском языке sh клавиатуры, легко набирать.

Другие оболочки :

  • cmd.exe тоже пришлось выбирать другой экранирующий символ и выбрал ^, каретка (формально известный как CIRCUMFLEX ACCENT, U+005E).

  • POSIX Подобные оболочки, такие как Bash, никогда не сталкивались с этой проблемой, потому что именно /, а не \, служит разделителем в Unix путях файловой системы; следовательно, эти оболочки используют \ в качестве escape-символа, как и большинство языков программирования.

1 голос
/ 01 апреля 2020

Если вы говорите о сценариях, PowerShell будет интерпретировать последовательность конца строки (\n) и \r\n (EOL) одинаково при синтаксическом анализе. \r\n EOL - это в основном Windows артефакт прошлого, и большинство современных (около 2018 г.) выпущенных Windows приложений будут интерпретировать их одинаково.

Это не кавычки, но серьезные акценты или backticks (клавиша тильды на большинстве клавиатур), и они являются назначенным символом escape-строки в PowerShell.

Одна вещь, которая влияет на синтаксический анализ Windows Сценарий PowerShell - это использование метки порядка байтов (BOM). Это единственный способ заставить интерпретатор PowerShell видеть юникод (например, эмодзи) в вашем коде; то есть с помощью UTF8-BOM.

0 голосов
/ 01 апреля 2020

Когда файл читается в массив строк с get-content (без -raw), окончаний строк вообще нет. Затем out-file (">") или set-content поместит окончания строк в зависимости от операционной системы. Ma c Раньше OS была только `r, но теперь это просто unix, сейчас` n.

Вот файл в osx, в котором просто `n (0x0A):

format-hex file


   Label: /Users/js/foo/file

          Offset Bytes                                           Ascii
                 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
          ------ ----------------------------------------------- -----
0000000000000000 61 62 63 0A 61 62 63 0A                         abc�abc�

У меня есть сообщение о преобразовании форматов здесь: Unix переводы строк в windows переводы строк (в Windows)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...