Есть ли хороший автоматизированный способ сделать общий блок текста квадратным? ?

Проблема устранена путем замены ~на путь к вашему домашнему каталогу.

Или вы можете использовать

perl -pe '$thing=`cat "$ENV{HOME}/file.txt"`;s/loremipsum/$thing/g' target.txt

или другую, более удобную , конструкцию, которая сначала считывает содержимое вашего файла, а затем заменяет строку этим значением.


sed— еще один инструмент для этого, и у него даже есть специальная команда для чтения в другом файле:

sed '/loremipsum/{
         r file.txt
         d
     }' target.txt

Это заменяет строку , содержащую текст loremipsum, содержимым file.txt.

Учитывая файл target.txt,

some text
some text loremipsum
some more text

и файл file.txt,

This text
is inserted

команда выдаст

some text
This text
is inserted
some more text
1
24.09.2019, 18:34
1 ответ

С помощью sedможно сделать

sed -E 'N;s/(.*)(\n) */\2\1/;/.{81}/s_^(.)(.{,79}[-+/*]) *_\2\1_;/^\n/!P;D' filename
  • -Eдля использования расширенных регулярных выражений, облегчающих чтение
  • Nдобавляет следующую строку в буфер
  • s/(.*)(\n) */\2\1/объединяет строки, перемещая новую строку в начало и удаляя отступы пробелов
  • /.{81}/действителен для строк, содержащих более 80 символов; в этом случае выполните s_^(.)(.{,79}[-+/*]) *_\2\1_, чтобы переместить разрыв строки на последний символ
  • /^\n/!Pесли первая строка в буфере не пуста, вывести ее
  • Dначать заново с остатком буфера

Как указал mosvy, этот скрипт имеет проблему с обратными косыми чертами в конце строки, поэтому их, вероятно, следует удалить с помощью s/\\$//. Кроме того, если бы могли быть более длинные строки ввода (, что не является проблемой OP, но, возможно, каким-то будущим читателем ), можно было бы заменить Nна /.{80}/!N. Таким образом, весь сценарий будет

sed -E 's/\\$//;/.{80}/!N;s/(.*)(\n) */\2\1/;/.{81}/s_^(.)(.{,79}[-+/*]) *_\2\1_;/^\n/!P;D' filename
1
27.01.2020, 23:40

Теги

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