4

Мне нужно заполнить последнюю строку файла пустым пробелом до позиции 80, и мне также нужно убедиться, что она всегда заканчивается без новых строк (CR/LF)

Информация

В Windows 10 приведенный ниже SED используется для переформатирования файла, чтобы CRLF находился в позиции 80 строки каждой строки до EOF и обновлял файл на месте, но в последней строке никогда не было CR или LF.

Исходный файл представляет собой огромную строку печатных символов без возврата каретки или перевода строки в этом файле, поэтому все начинается со строки номер один, а ниже - САС, который я использую для его переформатирования.

sed -i -e "s/.\{80\}/&\r\n/g" "C:\Folder\test.txt"

Моя проблема

Я не могу понять, как сделать так, чтобы последняя строка этого файла была заполнена до конца, до позиции 80 с пробелом и без возврата каретки.

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


предпочтение

Я бы предпочел использовать SED для этого, и мне нужно сохранить CRLF в других строках над последней строкой в том же формате, но я тоже хочу посмотреть на другие решения Windows, если не слишком сложные.


Соображения

Символы последней строки могут быть 1 символом, 79 символами, а может быть, даже потенциально 80 символами, и в этот момент мне нужно убедиться, что в последней строке нет возврата каретки или перевода строки, если непустое пространство заполняет ее до позиции строки. 80 на последней строчке.

Хотя снимок экрана содержит 91 строку, эти файлы могут содержать больше строк или меньше строк, но правила всегда должны быть одинаковыми; перевод строки возврата каретки в позиции 80 на каждой строке, а последняя строка должна быть ровно на 80 позиций после заполнения пробела, если это необходимо, и возврата каретки или перевода строки на нем нет.


Формат данных начальной точки

Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~EOL any legnth and no CR or LF

Желаемый конечный формат данных

Я не могу понять, как заполнить последнюю строку в файле пустым пространством без CR или LF в конце строки до позиции 80.

Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~[CR][LF]
Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~[CR][LF]
Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~[CR][LF]
Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~[CR][LF]
Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~[CR][LF]
Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~[CR][LF]
Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~[CR][LF]
EOL any legnth less than 80 no CR or LF fill rest empty space to position 80--->

Предупреждение: если вы используете вышеуказанные данные для тестирования, пожалуйста, замените буквенные символы [CR][LF] на те, которые действительно должны представлять.

1 ответ1

6

Попробуй это:

sed -i -e 's/.\{80\}/&\r\n/g' \
  -e 's/$/################################################################################/' \
  -e 's/\(\r\n.\{80\}\)#*$/\1/' "C:\Folder\test.txt"

(Я разбил команду на несколько строк только для удобства чтения в презентации; вы можете сделать все это в одной строке.)  В s/$/###…###/ добавляется 80 # символов, а затем s/\(\r\n.\{80\}\)#*$/\1/ ищет эту последовательность:

  • \r\n
  • 80 любого персонажа
  • любое количество # с
  • до конца буфера

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

Убедившись, что это работает, просто измените все вхождения # в приведенной выше команде на пробелы.


Окончательное рабочее решение OP

ПРИМЕЧАНИЕ: строка SET s10= содержит 10 пустых пробелов справа от знака равенства.

Пакетный скрипт

@ECHO ON

SET File=C:\Folder\test.txt
::: The below s10 variable equals ten white\empty spaces - so it has 10 blank spaces in it
SET s10=          
SET s40=%s10%%s10%%s10%%s10%
SET s80=%s40%%s40%

sed -i -e "s/.\{80\}/&\r\n/g" -e "s/$/%s80%/" -e "s/\(\r\n.\{80\}\)\s*$/\1/" "%File%"
GOTO :EOF

Мы можем сделать это немного легче для чтения и менее утомительным для ввода.

  1. Чистый сед

    Если ваш текст буквенно-цифровой, и есть какой-то символ (например, @), который никогда не появится в ваших данных, тогда вы можете сделать что-то вроде этого:

      -e 's/$/@@@@@@@@@@/' \        # Append 10 @ characters to the line.
      -e 's/@/        /g' \         # Change each @ to eight spaces.
    

    Если вы хотите, чтобы ваш сценарий был однозначно читаемым, за счет того, чтобы сделать его несколько более многословным, сделайте его еще на шаг дальше:

      -e 's/$/@@@@@@@@@@/' \        # Append 10 @ characters to the line.
      -e 's/@/@@@@@@@@/g' \         # Change each @ to eight @s (there are now 80 @s).
      -e 's/@/ /g'        \         # Change each of the 80 @s to a space.
    

    Если в ваших данных нет ни одного символа, который никогда не появляется, но есть некоторая (короткая) последовательность символов, например () , которая никогда не появляется, вы можете использовать тот же принцип:

      -e 's/$/()()()()()()()()()()/' \  # Append 10 () pairs to the line.
      -e 's/()/        /g' \            # Change each () to eight spaces.
    

    Будьте осторожны при работе с символами, которые являются специальными в регулярных выражениях; . , * , [ , ^ , & и т. д. (И не включайте # -комментарии в ваш скрипт в этих местах; чтобы разбить простую команду на несколько строк, \ должен быть последним символом в строке (перед перевод строки), а не в комментарии.)

  2. Использование оболочки

    Тот же принцип:

    #!/bin/sh
          ︙
    s="          "                  # Set $s to 10 spaces.
    s80="$s$s$s$s$s$s$s$s"          # Set $s80 to 8 copies of $s; i.e., 80 spaces.
          ︙
    sed -i -e 's/.\{80\}/&\r\n/g' \
      -e 's/$/'"$s80"'/' \
      -e 's/\(\r\n.\{80\}\)\s*$/\1/' "C:\Folder\test.txt"
    

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .