Почему в команде echo `ls -l` нет новых строк?

Я не знаю, есть ли для этого чисто командная строка, но PyPDF2 может помочь! Я только что адаптировал Gist, который я нашел , чтобы он соответствовал вашим потребностям, если вы не знакомы с программированием на Python.

Следующий код также доступен в виде Github Gist .

Не забудьте сделать sudo dnf install python3-PyPDF2и изменить имена файлов.

#!/bin/python3


from PyPDF2 import PdfFileReader, PdfFileWriter
from PyPDF2.pdf import PageObject

# Theses files are just for testing, no point in merging these
reader = PdfFileReader(open("Nextcloud Manual.pdf",'rb'))

# this defines the output page format (relevant if not the same)
sup_reader = PdfFileReader(open("Cplusplus.pdf",'rb'))

writer = PdfFileWriter()

for pageNo in range(min(reader.getNumPages(), sup_reader.getNumPages())):
    print("Merging page:", pageNo)
    invoice_page = reader.getPage(pageNo)
    sup_page = sup_reader.getPage(pageNo)
    translated_page = PageObject.createBlankPage(None, sup_page.mediaBox.getWidth(), sup_page.mediaBox.getHeight())
    translated_page.mergeScaledTranslatedPage(sup_page, 1, 0, 0)

    translated_page.mergePage(invoice_page)

    writer.addPage(translated_page)

with open('out.pdf', 'wb') as f:
    writer.write(f)

Редактировать :Обратите внимание, что это автоматически игнорирует превышение количества страниц в PDF-файле, содержащем больше страниц. Я мог бы предложить лучшее решение для этого, если это необходимо.

0
05.04.2020, 07:53
1 ответ

Цитирую !!

Когда вы выполняете ls -l, да, он генерирует новые строки (, когда вы сообщаете ). Однако, когда вы выполняете echo `ls -l`,, новые строки не видны. Попытайся.

Причина в том, что конструкция `...`является расширением команды, а на большинство расширений (есть и другие )влияет разделение оболочки (, если они не заключены в кавычки ). Разделение оболочки удаляет любой из символов в переменной IFS, которая по умолчанию содержит <space><tab><newline>. Все символы новой строки из ls -lудаляются, и в этот момент строка разделяется. Позже echoможет соединять каждую разделенную часть, разделяя их одним пробелом.

Так что, да, и старое, и правильное и предпочтительное в любое время новое:

echo `ls -l`
echo $(ls -l)

Файлы в текущем каталоге будут перечислены одной строкой без новой строки, если по умолчанию используется IFS.

Перенаправление этой строки в файл приведет к записи одной строки в этот файл, как и следовало ожидать.

echo $(ls -l) > file

Чтобы сохранить символы новой строки, процитируйте расширение:

echo "$(ls -l)"

Или, пожалуйста, избегайте использования устаревшего`...`:

echo "`ls -l`"

А чтобы получить вывод в файл, просто перенаправьте его в файл:

echo "$(ls -l)" > file
2
28.04.2021, 23:18

Теги

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