Sed для Windows не работает после редактирования в Powershell.

Вопрос или проблема

Я хочу автоматизировать выбор данных из pdf файла для дальнейшей обработки в электронной таблице.

1: Скопировать весь текст в .txt файл, используя Notepad – ок.

2: Удалить все переносы строк, CRLF, чтобы создать файл в одну строку, используя Powershell – ок.

Редактирование с помощью Sed для удаления ненужного текста не работает (я успешно использовал sed в течение 2 лет).

powershell -command “”$(Get-Content T1.txt)” > t2.txt”

sed -i -r “s/Limited/XX/g” t2.txt – не работает.

Однако, удаляя все переносы вручную с помощью Notepad++ (используя regex \r\n) для создания txt файла, та же команда sed работает нормально. Есть идеи? Может, альтернатива удалению всех переносов строк в .bat файле? Использую Win7 Prof 64-bit.

sed — это инструмент POSIX, предназначенный для обработки текста. Возможно, ваш “файл в одну строку” не является текстовым файлом с точки зрения POSIX:

Файл, содержащий символы, организованные в ноль или более строк. Строки не содержат NUL-символов, и ни одна из них не может превышать {LINE_MAX} байт в длину, включая символ <newline>. […] многие утилиты выводят предсказуемый или значимый результат, только работая с текстовыми файлами.

Если не пустой, он будет содержать только незавершённую строку:

Последовательность из одного или нескольких символов, отличных от <newline>, в конце файла.

Сравните с определением строки:

Последовательность из нуля или более символов, отличных от <newline>, плюс завершающий символ <newline>.

LF — это символ <newline> (CR не является таковым; в данном контексте CR не является особенным).

Я не знаю Powershell, и не могу сказать, корректен ли ваш код, но если он удаляет все переносы строк, то вероятно, что он создаёт незавершённую строку. Я полагаю, Notepad++ достаточно умен, чтобы всё равно завершить строку.

Некоторые реализации sed не обрабатывают незавершённые строки (пример), а некоторые делают это (по крайней мере, GNU sed). По-видимому, ваш sed этого не делает. Найдите sed, который делает, или убедитесь, что “однострочный” файл правильно завершается символом <newline>. Например, в Unix эта команда:

echo >> T1.txt

прибавляет ровно один символ <newline> к T1.txt. К сожалению, я не знаю, как это сделать в Powershell.

Обратите внимание, если исправленный T1.txt превысит {LINE_MAX} байт в своей единственной строке, то формально он всё равно не будет текстовым файлом, поэтому утилиты обработки текста могут всё равно не работать с ним. Моя мысль в том, что ваш sed может иметь ограничение на длину строки и поэтому может не срабатывать в некоторых случаях, даже после того, как вы исправите файл, добавляя завершающий символ <newline>.

См. этот ответ для получения идеи обходного пути.

.

Ответ или решение

Для решения проблемы, связанной с некорректной работой команды sed в Windows после удаления символов перевода строки с помощью PowerShell, необходимо внимательно рассмотреть каждый шаг вашего сценария.

Анализ проблемы

  1. Предпосылка: Вы успешно копируете текст из PDF в .txt файл с помощью Notepad.

  2. Удаление переводов строк (CRLF): Используете PowerShell для удаления всех CRLF, чтобы создать файл в одну строку. Это осуществляется через команду:

    "$(Get-Content T1.txt)" > t2.txt

    Однако данный метод превращает содержимое в строку без завершающего символа новой строки.

  3. Ошибка команды sed: Затем вы пытаетесь использовать sed для редактирования файла и получаете ошибку при попытке заменить "Limited" на "XX":

    sed -i -r "s/Limited/XX/g" t2.txt

Проблема

Ваша проблема, вероятно, связана с тем, что полученный файл не является текстовым по стандартам POSIX. В него не включен завершающий символ новой строки. Это создаёт "незавершённую строку", что некоторые реализации sed могут не обрабатывать корректно.

Решение проблемы

  1. Завершение строки: После того как вы удалили все переводы строк, добавьте один в конец файла t2.txt. Это можно сделать несколькими способами. Для тех, кто предпочитает использовать PowerShell, можете попробовать:

    Add-Content -Path t2.txt -Value "`n"
  2. Альтернатива PowerShell: Если необходимо альтернативно выполнять удаление, рассмотрите использование следующего сценария в командном файле (.bat):

    @echo off
    setlocal enabledelayedexpansion
    (for /f "delims=" %%i in (T1.txt) do set "line=!line!%%i") & echo !line!>t2.txt
    echo.>>t2.txt
  3. Ограничение длины строки: Убедитесь, что длина строки не превышает ограничений, установленных параметром {LINE_MAX}. Если файл содержит чрезвычайно длинную строку, это может вызвать проблемы с некоторыми утилитами.

Заключение

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

Надеюсь, данные рекомендации окажутся полезными в решении вашей задачи. Если останутся вопросы или потребуется дополнительная помощь, не стесняйтесь обращаться.

Оцените материал
Добавить комментарий

Капча загружается...