Вопрос или проблема
Я хочу автоматизировать выбор данных из 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, необходимо внимательно рассмотреть каждый шаг вашего сценария.
Анализ проблемы
-
Предпосылка: Вы успешно копируете текст из PDF в .txt файл с помощью Notepad.
-
Удаление переводов строк (CRLF): Используете PowerShell для удаления всех CRLF, чтобы создать файл в одну строку. Это осуществляется через команду:
"$(Get-Content T1.txt)" > t2.txt
Однако данный метод превращает содержимое в строку без завершающего символа новой строки.
-
Ошибка команды
sed
: Затем вы пытаетесь использоватьsed
для редактирования файла и получаете ошибку при попытке заменить "Limited" на "XX":sed -i -r "s/Limited/XX/g" t2.txt
Проблема
Ваша проблема, вероятно, связана с тем, что полученный файл не является текстовым по стандартам POSIX. В него не включен завершающий символ новой строки. Это создаёт "незавершённую строку", что некоторые реализации sed
могут не обрабатывать корректно.
Решение проблемы
-
Завершение строки: После того как вы удалили все переводы строк, добавьте один в конец файла
t2.txt
. Это можно сделать несколькими способами. Для тех, кто предпочитает использовать PowerShell, можете попробовать:Add-Content -Path t2.txt -Value "`n"
-
Альтернатива 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
-
Ограничение длины строки: Убедитесь, что длина строки не превышает ограничений, установленных параметром
{LINE_MAX}
. Если файл содержит чрезвычайно длинную строку, это может вызвать проблемы с некоторыми утилитами.
Заключение
Используйте вышеуказанные методы для корректировки вашего рабочего процесса, чтобы обеспечить совместимость с sed
. При необходимости, изучите возможность переключения на более подходящие инструменты, которые не имеют подобных ограничений, либо обновите до более современной версии sed
, поддерживающей вашу конфигурацию среды.
Надеюсь, данные рекомендации окажутся полезными в решении вашей задачи. Если останутся вопросы или потребуется дополнительная помощь, не стесняйтесь обращаться.